而Loop Parsing问题

时间:2018-01-30 21:14:11

标签: java oop

我试图给用户提供无限量的输入,直到他们输入q。我正在使用while语句来运行程序,但是当用户尝试退出时我得到一个错误,因为程序会尝试将q解析为整数。关于如何更改结构以防止错误发生的任何想法?

Scanner in = new Scanner(System.in);
System.out.println("What would you like your Fibonacci number to be?(enter q to quit)"); 
String value = in.next(); 
int trueValue;
while(!value.equalsIgnoreCase("q")) { 
    trueValue = Integer.parseInt(value);
    Fibonacci userCase = new Fibonacci(trueValue);
    System.out.println(userCase.calculateFibonacci(userCase.getCaseValue()));
    System.out.println("Please enter another number.");
    value = in.next(); 
    trueValue = Integer.parseInt(value);
} 

如果重要,这里是循环中调用的方法。

public int calculateFibonacci(int caseValue) {
    if(caseValue == 0) 
        return 0; 
    else if(caseValue == 1) 
        return 1; 
    else 
        return calculateFibonacci(caseValue-1) + calculateFibonacci(caseValue-2);
}

public int getCaseValue() 
{ 
    return caseValue;
}

2 个答案:

答案 0 :(得分:1)

您可以删除最后一个

trueValue = Integer.parseInt(value);

因为你已经在循环开始时这样做了。

答案 1 :(得分:0)

在检查之前{获取用户值}(检查是否正常);

    /* https://stackoverflow.com/questions/40519580/trying-to-determine-if-a-string-is-an-integer */
    private boolean isInteger(String str) {
        if(str == null || str.trim().isEmpty()) {
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            if(!Character.isDigit(str.charAt(i))) {
                return false;
            } 
        }
        return true;
    }

    public static String check(Scanner in) {
        String value;
        do {
           System.out.println("Please enter a number or q to quit.");
           value = in.next(); 
        } while(!value.equalsIgnoreCase("q") && !isInteger(value));
        return value;
    }

    public static void main (String[] args) { 
          Scanner in = new Scanner(System.in);
          String value = check(in);       
          while(!value.equalsIgnoreCase("q")) { 
              Fibonacci userCase = new Fibonacci(Integer.parseInt(value));
              System.out.println(userCase.calculateFibonacci(userCase.getCaseValue()));
              value = check(in);        
          }
          in.close();   
    }