2013-11-21 3 views
0

Всякий раз, когда я запускаю этот код, он работает довольно гладко, пока цикл while не пробегает один раз. Он вернется и попросит имя снова, а затем пропустите String b = sc.nextLine() ;, и напечатайте следующую строку.Я получаю утечки ресурсов

static Scanner sc = new Scanner(System.in); 

static public void main(String [] argv) { 
    Name(); 
} 

static public void Name() { 

boolean again = false; 
do 
{ 
    System.out.println("What is your name?"); 

    String b = sc.nextLine(); 
    System.out.println("Ah, so your name is " + b +"?\n" + 
      "(y//n)"); 
    int a = getYN(); 
    System.out.println(a + "! Good."); 
    again = askQuestion(); 
} while(again); 



} 

static public boolean askQuestion() { 
    System.out.println("Do you want to try again?"); 
    int answer = sc.nextInt(); 

    if (answer == 1) { 
     return true; 
    } 
    else { 
     return false; 
    } 

} 

static int getYN() { 
    switch (sc.nextLine().substring(0, 1).toLowerCase()) { 
    case "y": 
     return 1; 
    case "n": 
     return 0; 
    default: 
     return 2; 
    } 
} 

}

Кроме того, я пытаюсь создать эту программу таким образом, что я могу задать три вопроса (как чье-то имя, пол и возраст, может быть, больше, как раса и этажерки), и затем верните все эти ответы. Например, в самом конце, скажем: «Итак, ваше имя + имя +, вы + пол +, а вы + возраст + лет? Да/Нет». Что-то в этом роде. Я знаю, что есть способ сделать это, но я не знаю, как сохранить ответы в любом месте, и я не могу их захватить, поскольку они встречаются только в экземпляре метода.

ответ

0

Не пытайтесь сканировать текст с помощью следующей строки() ПОСЛЕ использования nextInt() с тем же сканером! Это может вызвать проблемы. Откройте метод сканера только для ints ... рекомендуется. Вы всегда можете разобрать строковый ответ сканера.

Кроме того, с помощью сканера таким образом, это не очень хорошая практика, вы можете организовать вопросы в массиве выбрать цикл чтения для уникального экземпляра сканера, как это:

public class a { 

    private static String InputName; 
    private static String Sex; 
    private static String Age; 
    private static String input; 
    static Scanner sc ; 

    static public void main(String [] argv) { 
     Name(); 
    } 

    static public void Name() { 

     sc = new Scanner(System.in); 

     String[] questions = {"Name?","Age","Sex?"};// 
     int a = 0; 
     System.out.println(questions[a]); 

     while (sc.hasNext()) { 
      input = sc.next(); 
      setVariable(a, input); 
      if(input.equalsIgnoreCase("no")){ 
       sc.close(); 
       break; 
      } 
      else if(a>questions.length -1) 
      { 
       a = 0; 
      } 
      else{ 
       a++; 
      } 
      if(a>questions.length -1){ 
       System.out.println("Fine " + InputName 
         + " so you are " + Age + " years old and " + Sex + "."); 
       Age = null; 
       Sex = null; 
       InputName = null; 
       System.out.println("Loop again?"); 

       } 
       if(!input.equalsIgnoreCase("no") && a<questions.length){ 
       System.out.println(questions[a]); 
       } 
     } 

    } 


    static void setVariable(int a, String Field) { 
     switch (a) { 
     case 0: 
      InputName = Field; 
      return; 
     case 1: 
      Age = Field; 
      return; 
     case 2: 
      Sex = Field; 
      return; 
     } 
    } 
} 

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

Надеюсь, это поможет! Надеюсь, это поможет!

+0

Простите, что это заняло много времени, чтобы вернуться к этому, но да, это помогает! Я понял! –

Смежные вопросы