2014-01-18 4 views
3

Я сейчас работаю над маленькой игрой, и у меня возникла проблема, которую я не могу исправить. У меня есть метод, который считывает ввод и сохраняет его в переменных. Для любого неправильного ввода будет выведено исключение IllegalArgumentException, где вы можете попробовать ввести еще раз. Но если вы сделаете это неправильно еще раз, он просто перейдет к следующему типу ввода. Но я хочу, чтобы он запрашивал ввод до ввода. Мой наставник сказал мне сделать это с попыткой и поймать, что я сделал, но поскольку сказал, что это будет делать это дважды, а затем продолжить.рекурсивно перехватывает исключения в Java

Here's код:

public void readSettings(){ 
    Scanner userinput = new Scanner(System.in); 
    System.out.println("Wie lange soll der Code sein? (4-10):"); 
    String input = userinput.nextLine(); 
    //Eingabe der Länge des zu lösenden Codes. Bei einer Eingabe außerhab des Wertebereichs wird dies gemeldet und neu gefragt. 
    try{ 
     if (input.matches("[4-9]|10")) { 
      this.codelength = Integer.parseInt(input); 
     } 
     else { 
      throw new IllegalArgumentException(); 
     } 
    } 

    catch (IllegalArgumentException e) { 
     System.out.println("Eingabe außerhalb des Wertebreichs!"); 
     //readSettings(); 
     System.out.println("Wie lange soll der Code sein? (4-10):"); 
     input = userinput.nextLine(); 
     if (input.matches("[4-9]|10")) { 
      this.codelength = Integer.parseInt(input); 
     } 
     else { 
      throw new IllegalArgumentException(e); 
     } 
    } finally { 

     System.out.println("Welche Ziffern sind erlaubt? 0- (1-9):"); 
     input = userinput.nextLine(); 
     //Hier wird die valuerange(Also die Maximale Zahl in der Reihe) abgefragt. 
     //Auch hier wird eine falche Eingabe abgefangen und der Input neu gestartet. (Leider nicht sehr elegant und benutzerfreundlich. 
     try { 
      if (input.matches("[1-9]")) { 
       this.valuerange = Integer.parseInt(input); 
      } 
      else { 
       throw new IllegalArgumentException(); 
      } 
     } 
     catch (IllegalArgumentException f) { 
      System.out.println("Eingabe außerhalb des Wertebreichs!"); 
      //readSettings(); 
      System.out.println("Welche Ziffern sind erlaubt? 0- (1-9):"); 
      input = userinput.nextLine(); 
      if (input.matches("[1-9]")) { 
       this.valuerange = Integer.parseInt(input); 
      } 
      else { 
       throw new IllegalArgumentException(f); 
      } 
     } finally { 

      //Falls der Modus nicht Cpmouter gegen Computer ist, wird ein Spielername mit abgefragt. 
      try { 
       if(!cpumode) { 
        System.out.println("Spielername:"); 
        this.spielername = userinput.nextLine(); 
        //Falls kein input bein Namen vorhanden, wird ein Fehler ausgegeben. 
        if (spielername.length()==0) { 
         throw new IllegalArgumentException("Fehler, kein Spielername eingegeben!"); 

        }  
       } 
      } catch (IllegalArgumentException e) { 
       System.out.println("Spielername:"); 
       this.spielername = userinput.nextLine(); 
       if (spielername.length()==0) { 
        //throw new IllegalArgumentException("Fehler, kein Spielername eingegeben!"); 
        throw new IllegalArgumentException(e); 
       }  

      } 
     } 
    } 
}  

Я надеюсь, что вы можете мне помочь. Спасибо!

+3

_ «Но я хочу, чтобы он запрашивал ввод до тех пор, пока вход не будет действительным» _ Используйте структуру do/while. –

+0

Домашнее оповещение! – Sikorski

+1

@Sikorski Этот вопрос, похоже, касается тех, кто сталкивается с проблемой во время своей домашней работы. Это не одна из тех типичных * Прямая копия заданий + Вопросительный знак *. – skiwi

ответ

0

Первый шаг - осознать, что вы повторяете свою «прочитанную длину кода». Это обычно означает две вещи: 1) вы должны извлечь код в метод и вызвать этот метод несколько раз, или 2) вы должны использовать цикл и написать код в цикле. (или и то и другое)

предложение цикла должно вызвать звонок, потому что только это (или рекурсия ...) позволяет вам повторить операцию нефиксированное количество раз, как вы этого хотите. В псевдокоде:

repeat 
    readNumber 
until number is valid 

как вы видите, состояние находится в нижней части петли. В Java вы должны использовать do {...} while(...); - обратите внимание, что вам нужно отменить условие из псевдокода, потому что это while, а не until.

На стороне примечания, как вы сами делаете исключение, вы можете просто пропустить метание и вместо этого оставить свой codelength по значению, которое вы признаете недействительным, например. -1. Это вам все равно понадобится, так как вам нужно поймать исключение как часть части readNumber, которая все еще находится внутри вашего цикла.

+0

I've сделал это, как вы сказали, с сделай {}, а() таким образом: 'просим для ввода и проверки wehther вход правилен если, установите переменную , если нет, то возвращает ошибку в то время как вход не соответствует ' Но я получаю нулевой указатель при вводе строки. не сопоставив. – Superpilotv2

+0

Я не могу сказать вам, почему вы получаете NPE без вашего кода, но, цитируя себя: «вы должны поймать Исключение как часть части readNumber». Другими словами: * не * вызывать исключение внутри цикла; проверьте вместо этого переменную 'codelength' –

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