2016-03-09 6 views
2

Я новый программист, пытающийся практиковать, создавая игру. Я хочу, чтобы игрок мог установить свое имя, а также ответить «да» или «нет» относительно того, правильно ли это имя. Я сделал это, используя цикл while. Однако, поскольку имя инициализируется внутри цикла, я не могу использовать его снаружи. Мне было интересно, если это все равно.JAVA: Можно ли использовать переменную вне цикла, которая была инициализирована внутри цикла?

Мой код, вероятно, очень простой и грязный. Я прошу прощения за то.

Scanner input = new Scanner(System.in); 
    String name; 
    int nameRight = 0; 

    while (nameRight == 0) { 

     System.out.println("What is your name?"); 
     name = input.nextLine(); 

     System.out.println("So, your name is " + name + "?"); 
     String yayNay = input.nextLine(); 

     if (yayNay.equals("yes") || yayNay.equals("Yes")) { 
      System.out.println("Okay, " + name + "..."); 
      nameRight++; 

     } 
     else if (yayNay.equals("no") || yayNay.equals("No")) { 

      System.out.println("Okay, then..."); 

     } 

     else { 
      System.out.println("Invalid Response."); 
     } 

    } 

В принципе, я хочу, чтобы имя строки было инициализировано внутри цикла, поэтому я могу использовать его вне цикла.

+0

Нет, это невозможно использовать за пределами внешнего вида, если определение переменной находится внутри цикла. Но так как 'name' определяется вне цикла, вы также сможете использовать его за пределами цикла. – SomeJavaGuy

+0

Нет. Возможно, вы сможете использовать его значение, если вы скопируете его в переменную, объявленную за пределами цикла, но тогда вы можете так же легко объявить эту переменную из цикла. – Stultuske

+0

Хорошо спасибо. Тогда мне нужно будет изменить код. – max

ответ

6

Область действия переменной ограничивает использование этой переменной в области, в которой она определена. Если вы хотите, чтобы она использовалась в более широкой области видимости, объявите ее вне цикла.

Однако, поскольку имя инициализировано внутри цикла, я не могу использовать его снаружи.

Вы определили переменную вне цикла, так что вам нужно только ее инициализировать, поскольку сообщение об ошибке, которое вы должны получить, предлагает.

String name = "not set"; 

while(loop) { 
    name = ... 

    if (condition) 
     // do something to break the loop. 
} 
// can use name here. 

Основная проблема заключается в том, что компилятор не может работать, что переменный будет установлено во всех возможных путях коды. Существует два способа исправить это, не используя фиктивное значение. Вы можете использовать цикл do/while.

String name; 
boolean flag = true; 
do { 
    name = ... 
    // some code 
    if (test(name)) 
     flag = false; 
    // some code 
} while(flag); 

или отказаться от условия, так как вам не нужен счетчик.

String name; 
for (;;) { 
    name = ... 
    // some code 
    if (test(name)) { 
     break; 
    // some code if test is false. 
} 
+0

Спасибо. Я заработал так, как хотел. – max

+1

Не уверен, что он может использовать имя там, потому что ваш цикл никогда не заканчивается. Я понимаю, что это всего лишь пример, но ради новых программистов повсюду добавьте комментарий внутри цикла, указав, что какая-то работа выполняется там или, возможно, это имя устанавливается? – Neil

1

НЕТ, это было бы невозможно, так как область действия переменной, объявленной в цикле, ограничивается циклом. Таким образом, переменная недоступна.

while(i < 10){ 
    int x = 2; 
    i++; 
} 

В настоящее время, объем х будет от точки, в которой он определен в конце блока вмещающей. Таким образом, переменная здесь будет создана и уничтожена 10 раз, если я начну с 0.

+0

Пожалуйста, избегайте ссылок на ссылки. –

0

Сначала есть «область», это проблема, которую вы сейчас касаетесь. То, как вы это делали до сих пор, похоже, является хорошим способом сделать это, и вы сможете использовать/получить доступ к переменной имени из любого места в коде после строки 2 из того, что вы связали.

Область действия в основном говорит, что вы можете использовать переменную внутри фигурных скобок {}, которую вы ОБРАТИЛИСЬ внутри. Я предполагаю, что у вас есть код в какой-то основной метод в настоящее время, таким образом, вы можете получить доступ к переменной имя из любой точки после строки

String name; 

до тех пор, пока вы не попытаетесь использовать его после закрытия}, соответствующее открытию {, которое произошло до объявления имени.

РЕШЕНИЕ: Что нужно сделать, чтобы использовать переменную вне цикла, чтобы объявить его перед началом цикла, вы не должны инициализировать переменную перед тем, но у вас есть чтобы инициализировать его, прежде чем пытаться использовать его для чего-либо. В общем случае, если вам нужно получить доступ к переменной в более широкой области, вы должны объявить эту переменную перед тем, как войти в не очень широкую область.

Обратите внимание, что, объявив, что я имею в виду создание ссылки на переменные, используя «String» перед «name». Не путайте его с инициализацией или присваиванием ему значения, которое не имеет ничего общего с областью, только объявление задает область.