捕获异常后继续执行程序

时间:2016-01-27 16:51:27

标签: java exception exception-handling try-catch inputmismatchexception

捕获异常后,如何继续执行Java程序?

我制作了一个程序,要求用户输入一个数字,它将返回该数字除以生成的随机数。但是,如果用户输入类似' a'的字母,则会捕获异常。

如何使程序继续执行而不是在捕获异常后终止?

do{                     //Begin of loop 
    try{                        //Try this code 
        System.out.println("Enter a number"); 
        double i = read.nextDouble(); //Reads user input  
        double rn = r.nextInt(10);   //Generates random number rn 
        System.out.println(i +  " divided by random number " + rn + " is " + (i/rn)); 
    }catch(InputMismatchException type_error){         //Catches error if there is a type mismatch
        //Example error: if user enters a letter instead of a double
         System.out.println("Error. You cannot divide a letter by a number!"); 
        break;  //break stops the execution of the program 
    } 

    //using a continue statement here does not work 
}while(true);       //Loop forever 

6 个答案:

答案 0 :(得分:2)

继续获得帮助!如果使用Scanner类输入数字,则会出现无限循环写入"错误。你不能用一个数字来划分一个字母!"到输出。

您的代码等待一个双号,但收到了一封信。此事件触发异常,代码显示错误消息。但是这封信将保留在扫描仪中,因此nextInt命令会尝试在下一次迭代中加载相同的字母,而无需等待您输入。

在catch块中,您必须使用read.next()命令清空扫描仪。

    Scanner read = new Scanner(System.in);
    Random r = new Random();

    do {                     //Begin of loop 

        try {                        //Try this code 
            System.out.println("Enter a number");
            double i = read.nextDouble(); //Reads user input  
            double rn = r.nextInt(10);   //Generates random number rn 
            System.out.println(i + " divided by random number " + rn + " is " + (i / rn));

        } catch (InputMismatchException type_error) {         //Catches error if there is a type mismatch
            //Example error: if user enters a letter instead of a double
            System.out.println("Error. You cannot divide a letter by a number!");

            // Empty the scanner before the next iteration: 
            read.next();
        }

    //using a continue statement here does not work 
    } while (true);       //Loop forever 

答案 1 :(得分:1)

continue语句将重新启动循环(与break语句相反,后者终止循环)。

因此,如果您将break;替换为continue;,则会在Exception被捕获后继续循环播放(假设没有其他Exception被抓住但被抓住的那个) ,ans显示错误信息。

基本上它会再次打印"Enter a number"等等。

警告

您还需要使用Scanner的下一个值。 如果不这样做,使用continue将永远循环,在发生错误时无需用户交互。

示例

Scanner read = new Scanner(System.in);
do {
    try {
        // trimmed out non-necessary stuff
        System.out.println("Enter a number");
        double i = Double.parseDouble(read.nextLine());
        System.out.println(i);
        // changed exception caught
    } 
    catch (NumberFormatException type_error) {
        System.out.println("Error. You cannot divide a letter by a number!");
        continue;
    }

} while (true);

最后的注释

Berger所述,continue此处甚至不需要,因为您只打印一条警告消息。

答案 2 :(得分:0)

break语句导致循环结束。

  

break语句有两种形式:标记和未标记。你看到了   在前面讨论的switch语句中没有标记的形式。您   也可以使用未标记的中断来终止 a for,while或do-while   环

解决方案:

将其更改为continue

  

continue语句跳过for的当前迭代,而,   或者do-while循环。

答案 3 :(得分:0)

break语句导致循环退出。由于您在try - catch构造之后的循环中没有代码,因此您只需删除break语句。

请注意,Scanner方法(我假设readScannernextDouble()如果下一个标记代表双精度,则返回double值。如果没有,它会抛出异常而不消耗该令牌。因此,您需要确保使用下一个值,您可以使用read.next()

do{                     //Begin loop 

    try{                        //Try this code 
        System.out.println("Enter a number"); 
        double i = read.nextDouble(); //Reads user input  
        double rn = r.nextInt(10);   //Generates random number rn 
        System.out.println(i +  " divided by random number " + rn + " is " + (i/rn)); 


    }catch(InputMismatchException type_error){         //Catches error if there is a type mismatch
    //Example error: if user enters a letter instead of a double
         System.out.println("Error. You cannot divide " + read.next() + " by a number!"); 

    } 



} while(true); 

答案 4 :(得分:0)

另一个解决方案是将SELECT Table2.id, Table2.child FROM (SELECT MIN(id) AS master FROM Table1) AS Table1 INNER JOIN Table2 ON Table1.master = Table2.id 替换为break

read.nextLine();语句导致循环结束。

break会一次又一次打印continue

但是Enter a number,代码会一次又一次地询问输入。

如果您删除read.nextLine();read.nextLine();,代码会一次又一次打印输入数字。

答案 5 :(得分:-1)

删除休息时间;从那里,一切都会正常。

但请记住,在终止条件下,我不会在任何地方看到它。