2017-01-29 4 views
0

Я использую сканер, чтобы получить пользовательский ввод. Если пользователь вводит имя, я добавляю его к ArrayList. Если пользователь не вводит имя, тогда я хочу исключить исключение, но я хочу продолжить цикл, который получит ответ.try catch for Scanner

for(int i = 0; i < totalLanes; i++){ 
    runArr.add(this.addRacer()); 
} 

public static String addRacer() throws NullPointerException{ 
    System.out.print("Enter a name for a racer: ");//Method uses try catch to catch a NullPointerException. 
    Scanner sc = new Scanner(System.in); 
    String rName = null; 
    try {    
     if(!sc.nextLine().isEmpty()){ 
      rName = sc.nextLine(); 
     }else{ 
      throw new NullPointerException("name cannot be blank"); 
     } 
    } 

    catch (NullPointerException e) { 
     System.out.println(e.toString()); 
     System.out.print("Enter a name for a racer: "); 
     addRacer(); 
    } 
    return rName; 
} 
  • Почему это рекурсивный бесконечно?
  • Каков наилучший способ получить данные от пользователя, но сделать уверен, что они вводят действительные данные?

Заранее спасибо.

+2

В чем проблема с программированием? Вопрос не ясен. – SteelToe

+0

Это будет длиться бесконечно, если 'addRacer' не возвращается. Согласно вашему коду, это произойдет, если условие 'if' никогда не будет удовлетворено .... Прочитайте ответ @Grzegorz Górkiewicz ниже –

ответ

1

Проблема в том, что вы дважды читаете ввод. Я имею в виду, что у вас есть два вызова метода sc.nextLine() в вашем коде. Попробуйте вместо этого:

String rName = sc.nextLine(); 
try { 
    if(rName.isEmpty()){ 
     throw new NullPointerException("Name cannot be blank."); 
    } 
} 
0

Вы не должны бросить исключение для этого. Просто используйте время цикла:

String rName = sc.nextLine(); 
while (rName.isEmpty()) { 
    System.out.println("Name can't be blank. Try again."); 
    rName = sc.nextLine(); 
} 
return rName; 

После этого цикла вы гарантированно иметь непустое имя переменной, и вы можете использовать это имя для добавления нового гонщика. Вам не нужна рекурсия.

0

Вы можете использовать do{}while() в вашем случае, это может быть лучший путь:

Scanner sc = new Scanner(System.in); 
String rName; 

do { 

    System.out.print("Enter a name for a racer: "); 
    rName = sc.nextLine(); 
    try { 
     if (rName.isEmpty()) { 
      //throw and exception 
      throw new NullPointerException("name cannot be blank"); 
     } 
    } catch (NullPointerException e) { 
     //print the exception 
     System.out.println(e.getMessage()); 
    } 

} while (rName.isEmpty()); 

return rName; 

Таким образом, вы не можете разбить цикл, пока значение в не пусто.

0

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

Для этого вам нужно использовать while loop

Что является лучшим способом для получения ввода от пользователя, но убедитесь, что они вводящих достоверные данные?

Используйте команду while loop, которая должна выполняться до тех пор, пока пользователь не введет действительный ввод. Вам не нужно использовать рекурсию за то, чего вы пытаетесь достичь.

public static String addRacer() throws NullPointerException{ 
    System.out.print("Enter a name for a racer: "); 
    Scanner sc = new Scanner(System.in); 
    String rName = null; 
    try { 
     String rName = sc.nextLine(); 

     if(rName.isEmpty()){ 
      throw new NullPointerException("name cannot be blank"); 
     } 
      while (rName.isEmpty()) { 
       System.out.println("Name can't be blank. Try again."); 
       rName = sc.nextLine(); 
      } 
    } 

    catch (NullPointerException e) { 
     System.out.println(e.toString()); 
    } 
    return rName; 
} 
0

Не вызывайте функцию addRacer() в catch. А также удалите строку, которую я отметил. Используйте, если другое условие для рекурсии.

catch (NullPointerException e) { 
     System.out.println(e.toString()); 
     System.out.print("Enter a name for a racer: ");//remove this 
     addRacer();//remove this 
    }