2016-10-09 3 views
1

Я пытаюсь проверить вход пользователя так, что программа вернется к первому вопросу о запросе пользователя для оценки, если он НЕ является int, а int не находится в пределах от 9 до 12 включительно. Есть ли «лучший» способ написания этого кода?Есть ли способ сделать этот код подтверждения пользователя более эффективным и/или более легким для чтения?

do 
    { 
     if (userGrade < 9 || userGrade > 12) 
     { 
      System.out.println("That is not a valid grade!"); 
     } 

      System.out.printf("Grade (9-12): "); 

     while(!enterInfo.hasNextInt()) 
     { 
      System.out.println("That is not a number! Enter in a valid number."); 
      enterInfo.next(); 
     } 
     userGrade = enterInfo.nextInt(); 
    } while (userGrade < 9 || userGrade > 12); 
+0

Условие while повторяется внутри блока do. – Stavm

+0

Это выглядит нормально, за исключением того, что прочитав что-нибудь, вам нужно вызвать 'enterInfo.nextLine()', чтобы использовать новую строку из буфера. – Bohemian

+0

Вы также можете использовать 'while (true)' loop и 'break;' из него, когда ответ верен. –

ответ

0

В основном я читал System.in и пока есть что-то, сначала я хотел бы попробовать преобразовать в целое, а затем проверить, что Integer находится в правильном диапазоне:

package trial; 

import java.util.Scanner; 

public class TestScan { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try { 
      System.out.println("Please introduce a number:"); 
      Scanner sc = new Scanner(System.in); 
      while(sc.hasNext()){ 
       String input=sc.next(); 
       Integer inputInt; 
       try{ 
        inputInt=Integer.parseInt(input); 
       }catch(Exception e){ 
        System.out.println("You must introduce a number"); 
        continue; 
       } 
       if(inputInt<9 || inputInt>12){ 
        System.out.println("Number must be between 9 and 12 (inclusive)"); 
        continue; 
       } 
       System.out.println("Correct!"); 
      } 
      sc.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 

Стоит отметить, , из-за чтения из System.in, эта программа может быть выполнена из вашего IDE, так что вам придется выполнить его за пределами IDE:

1.-гоу в папку TestScan и скомпилировать его: JAVAC TestScan.java

2.- укажите этот класс в своем классе, чтобы его выполнить. Например. если вы в C: Вы могли бы использовать что-то вроде

C:> Java -classpath C: \ рабочего пространства \ StackOverflow \ SRC trial.TestScan

0
if (userGrade < 9 || userGrade > 12) 
    { 
     System.out.println("That is not a valid grade!"); 
    } else { 
    do { 
     System.out.printf("Grade (9-12):   
     "); 

    while(!enterInfo.hasNextInt()) 
    { 
     System.out.println("That is not a number! Enter in a valid number."); 
     enterInfo.next(); 
    } 
    userGrade = enterInfo.nextInt(); 
} while (userGrade < 9 || userGrade > 12)} 
1

Для того, чтобы чистящий код можно использовать инкапсуляцию, основанный на классы и методы (инкапсуляция является основной причиной ООП).

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

Обратите внимание, например, как объект сканера используется только в локальном контексте метода readInput.

import java.util.InputMismatchException; 
import java.util.Scanner; 

public class KillerLoop { 

private boolean notReady; 
private int grade; 

public static void main(String[] args) { 

    new KillerLoop(); 

} 

/** 
* the default constructor calls the doStuff method 
* which contains the main loop of the program 
*/ 
public KillerLoop() { 
    this.notReady = true; 
    doStuff(); 
} 

/** 
* the programs main loop 
*/ 
private void doStuff() { 
    while (this.notReady) { 
     int input = this.readInput(); 
     this.verifyInput(input); 
    } 
    System.out.println("Grade " + this.grade + " is a correct grade!"); 
} 

/** 
* verifies a users input 
* if the input is correct, notReady will be set 
* to false so that the programs main loop is left 
* (you could also use an if construct with break for this purpose) 
* @param userGrade the users input 
*/ 
private void verifyInput(int userGrade) { 
    if (userGrade < 9 || userGrade > 12) { 
     System.out.println("That is not a valid grade!\n" + "Grade (9-12): "); 
    } else { 
     this.grade = userGrade; 
     this.notReady = false; 
    } 

} 

/** 
* this method reads input from the command line 
* and returns an integer if successful 
* @return the users input as integer 
*/ 
private int readInput() { 
    Scanner scanner = new Scanner(System.in); 
    System.out.println("enter a grade"); 

    int userGrade = 0; 

    try { 
     userGrade = scanner.nextInt(); 
    } catch (InputMismatchException e) { 
     System.out.println("That is not a number! Enter in a valid number."); 
     this.readInput(); //this recursion might not always be a good idea ;) 
    } 
    return userGrade; 
} 
} 

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

  • Нет связанных вопросов^_^