关于Java中一些简单的异常处理

About some simple exception handling in Java

有几个问题想请教,请参考我在代码中添加的注释部分,谢谢。

package test;

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

public class Test {
    /* Task:
     prompt user to read two integers and display the sum. prompt user to read the number again if the input is incorrect */

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        boolean accept_a = false;
        boolean accept_b = false;
        int a;
        int b;

        while (accept_a == false) {
            try {
                System.out.print("Input A: ");
                a = input.nextInt();            /* 1. Let's enter "abc" to trigger the exception handling part first*/

                accept_a = true;
            } catch (InputMismatchException ex) {
                System.out.println("Input is Wrong");
                input.nextLine();                 /* 2. I am still not familiar with nextLine() parameter after reading the java manual, would you mind to explain more? All I want to do is "Clear Scanner Buffer" so it wont loop for the println and ask user to input A again, is it a correct way to do it? */

            }
        }

        while (accept_b == false) {
            try {
                System.out.print("Input B: ");
                b = input.nextInt();
                accept_b = true;
            } catch (InputMismatchException ex) {              /*3. Since this is similar to the above situation, is it possible to reuse the try-catch block to handling b (or even more input like c d e...) exception? */

                System.out.println("Input is Wrong");
                input.nextLine();
            }

        }
        System.out.println("The sum is " + (a + b)); /* 4. Why a & b is not found?*/

    }
}
  1. I am still not familiar with nextLine() parameter after reading the java manual, would you mind to explain more? All I want to do is "Clear Scanner Buffer" so it wont loop for the println and ask user to input A again, is it a correct way to do it?

input.nextInt();之后使用input.nextLine();是为了清除输入流中剩余的内容,因为(至少)换行符仍在缓冲区中,将内容留在缓冲区将导致 input.nextInt(); 继续抛出一个 Exception 如果它没有首先被清除

  1. Since this is similar to the above situation, is it possible to reuse the try-catch block to handling b (or even more input like c d e...) exception?

可以,但是如果输入 b 错误会怎样?您是否要求用户重新输入输入a?如果您有 100 个输入,而最后一个输入错误,会发生什么?实际上,您最好编写一个方法来执行此操作,即提示用户输入一个值并返回该值的方法

例如...

public int promptForIntValue(String prompt) {
    int value = -1;
    boolean accepted = false;
    do {
        try {
            System.out.print(prompt);
            value = input.nextInt();
            accepted = true;
        } catch (InputMismatchException ex) {
            System.out.println("Input is Wrong");
            input.nextLine();
        }
    } while (!accepted);
    return value;
}
  1. Why a & b is not found?

因为它们尚未初始化,编译器无法确定它们是否具有有效值...

试着把它改得更像。

int a = 0;
int b = 0;
  1. 是的,没关系。并将消耗非整数输入。
  2. 是的。如果我们把它提取到一个方法中。
  3. 因为编译器认为它们可能没有被初始化。

我们来简化提取一个方法,

private static int readInt(String name, Scanner input) {
    while (true) {
        try {
            System.out.printf("Input %s: ", name);
            return input.nextInt();
        } catch (InputMismatchException ex) {
            System.out.printf("Input %s is Wrong%n", input.nextLine());
        }
    }
}

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    int a = readInt("A", input);
    int b = readInt("B", input);
    System.out.println("The sum is " + (a + b));
}

我已对该问题行发表评论。

package test;

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

public class Test {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    boolean accept_a = false;
    boolean accept_b = false;
    int a=0;
    int b=0;

    System.out.print("Input A: ");

    while (accept_a == false) {
        try {

            a = input.nextInt();  // it looks for integer token otherwise exception     

            accept_a = true;
        } catch (InputMismatchException ex) {
            System.out.println("Input is Wrong");
            input.next();    // Move to next other wise exception // you can use hasNextInt()         

        }
    }

    System.out.print("Input B: ");
    while (accept_b == false) {
        try {

            b = input.nextInt();
            accept_b = true;
        } catch (InputMismatchException ex) {     

            System.out.println("Input is Wrong");
            input.next();
        }

    }
    System.out.println("The sum is " + (a + b)); // complier doesn't know wheather they have initialised or not because of try-catch blocks. so explicitly initialised them.

}

}

Check out this "nextLine() after nextInt()"

并将变量a和b初始化为零

nextInt() 方法不读取最后一个换行符。