捕获异常后for循环继续出现问题

时间:2015-06-24 02:52:51

标签: java for-loop exception-handling inputmismatchexception

嗨,我是java的半新人,不能想出这个。捕获异常后,我想要一个for循环继续并继续读取新的整数。这是一个希望你采取的在线挑战 5(这说明它之后应该有多少输入),

-150,
150000,
1500000000,
213333333333333333333333333333333333,
-100000000000000.

转到这个输出:

-150 can be fitted in:
* short
* int
* long
150000 can be fitted in:
* int
* long
1500000000 can be fitted in:
* int
* long
213333333333333333333333333333333333 can't be fitted anywhere.
-100000000000000 can be fitted in:
* long

我希望计算机检查一个字节,short,int和long的数字是否大。它工作(可能不是最好的方式),直到它达到213333333333333333333333333333333333。它导致InputMismatchException(bc它变大)并且代码捕获它但是在它不起作用之后。这是输出:

 -150 can be fitted in:
 * short
 * int
 * long
 150000 can be fitted in:
 * int
 * long
 1500000000 can be fitted in:
 * int
 * long
 0 can't be fitted anywhere.
 0 can't be fitted anywhere.

我真的无法弄明白任何帮助都会受到赞赏!

public static void main(String[] args) {
    int numofinput = 0;
    Scanner scan = new Scanner(System.in);
    numofinput = scan.nextInt();
    int[] input;
    input = new int[numofinput];
    int i =0;

    for(i = i; i < numofinput && scan.hasNext(); i++){ 
        try {

            input[i] = scan.nextInt();
            System.out.println(input[i] + " can be fitted in:");

            if(input[i] >=-127 && input[i] <=127){
                System.out.println("* byte");
            }if((input[i] >=-32768) && (input[i] <=32767)){
                System.out.println("* short");
            }if((input[i] >=-2147483648) && (input[i] <=2147483647)){
                System.out.println("* int");
            }if((input[i] >=-9223372036854775808L) && (input[i] <=9223372036854775807L)){
                System.out.println("* long");
            }

        }catch (InputMismatchException e) {
            System.out.println(input[i] + " can't be fitted anywhere.");
        }   
    }
}

1 个答案:

答案 0 :(得分:3)

问题是在异常之后Scanner 中的输入不匹配仍未声明,因此您将永远在循环中捕获相同的异常。

要解决此问题,您的程序需要从Scanner删除一些输入,例如通过调用nextLine()块中的catch

try {
    ...
} catch (InputMismatchException e) {
    // Use scan.next() to remove data from the Scanner,
    // and print it as part of error message:
    System.out.println(scan.next() + " can't be fitted anywhere.");
}

input[]数组可以替换为单个long input,因为您从不使用先前迭代的数据;因此,无需将其存储在数组中。

此外,您应该通过调用nextInt来取代对nextLong的通话,否则您将无法正确处理大数字。

您还应该删除long完全

的条件
if((input[i] >=-9223372036854775808L) && (input[i] <=9223372036854775807L))

因为阅读true已成功完成,所以保证为nextLong

最后,使用&#34;魔术数字&#34;在程序中应避免使用相应内置Java类的预定义常量,例如

if((input[i] >= Integer.MIN_VALUE) && (input[i] <= Integer.MAX_VALUE))

而不是

if((input[i] >=-2147483648) && (input[i] <=2147483647))