使用外部循环进行异常处理

时间:2017-02-06 04:33:15

标签: java loops exception-handling

我试图处理用户输入并且只允许输入浮点数。可以输入的浮点数是无限制的,但如果输入两个连续的非浮点数,程序将结束。当程序结束时,它将打印所有数字的总和。

问题是每当我运行它时,它会立即运行while循环并将计数增加到2并打破循环。您只能在取消之前输入一个非浮动。

     while(true){
        try{
            sum+= inRead.nextFloat();
        }
        catch (InputMismatchException e){
            if (count == 2){
                System.out.println(sum);
                break;
            }
            else{
                count+=1;
            }
        }
    }

编辑:正如你们中的一些人所指出的,应该在while循环之前初始化count

    Scanner inRead = new Scanner(System.in);
    float sum = 0;
    int count = 0;
    while(true){
        try{
            sum+= inRead.nextFloat();
        }
        catch (InputMismatchException e){
            if (count == 2){
                System.out.println(sum);
                break;
            }
            else{
                count+=1;
            }
        }
    }

4 个答案:

答案 0 :(得分:1)

试试这个:

    Scanner inRead = null;
    float sum = 0;
    int count = 0;
    while(true){
        try{
            inRead = new Scanner(System.in);
            sum+= inRead.nextFloat();
            if(count == 1) {
                count = 0;
            }
        }
        catch (InputMismatchException e){
            if (count == 1){
                System.out.println(sum);
                break;
            }
            else{
                inRead = null;
                count+=1;
            }
        }
    }

代码中的counter增量为2,因为当您在InputMismatchException方法中遇到nextFloat()时。您遇到的第二个nextFloat()将无效,因为您需要为此创建new Scanner,因为它会在循环中导致错误,并在您需要重置时添加if(count == 1) 0 因此当输入两个连续的非浮动时,它可以满足您的问题停止并添加所有

答案 1 :(得分:0)

你应该在while循环开始之前将count初始化为0并且一切正常。如果您已将count初始化为1,那么当输入非浮点数时,count变为2,如果输入非浮点数,则下次循环终止。

答案 2 :(得分:0)

也许您在代码中较早的某处重用了变量count,导致它由于值不正确而提前中断。

您应该将count初始化为0,并且只有在输入非浮点数时才会递增。

发布更多代码有助于解决问题。

答案 3 :(得分:-1)

接受的答案已被破坏,因为构建了其他Scanner个实例may actually discard parts of the input。我强烈建议only ever using one object to read from System.in,因为像Scanner这样的输入阅读器对象可以(并且常见)从源内部缓冲数据,并用新实例替换该对象会丢弃第一个输入对象已经缓冲。

也没有必要得到你想要的行为。而是使用.next()跳过下一个令牌(如果它无效),并使用.hasNextDouble()确定下一个令牌是否为有效double(而不是捕获InputMismatchException)。

try (Scanner in = new Scanner(System.in)) {
  double sum = 0;
  boolean lastInputBad = false;
  while (true) {
    if (in.hasNextDouble()) {
      sum += in.nextDouble();
      lastInputBad = false;
    } else if (lastInputBad) {
      break; // break the loop on a subsequent bad input
    } else {
      in.next(); // skip first bad input
      lastInputBad = true;
    }
  }
  System.out.println("Sum of valid inputs: " + sum);
}

另请注意,我使用的是double,而不是float。基本上no reason to use float in modern code;坚持double