【问题标题】:try catch exception while loop尝试在循环中捕获异常
【发布时间】:2014-03-06 20:39:45
【问题描述】:

我希望程序在捕获异常时重新执行 while 循环 - 异常接收数字零。相反,它使用下面的代码继续一个while循环,我希望它再次要求用户输入,直到用户输入一个与零不同的数字。

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

public class whilePerjashtim {

    public static int division(int a, int b){

        return a/b;
    }

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        int a, b;

        System.out.println("Enter a value: ");
        a = s.nextInt();

    while(true){

        try
        {

            System.out.println("Enter b value");
            b = s.nextInt();

            System.out.println("Sum of division is: " + division(a,b));


        }

        catch(ArithmeticException e) 
        {
            System.err.println("Don't divide by zero!!!");      
        }

        catch (java.util.InputMismatchException e)
        {
            System.err.println("Enter just a Number!!!");
        }

        finally
        {
            System.out.println();
        }

    }

    }
}

【问题讨论】:

  • 如何打破循环?你如何继续循环?
  • 你试过用 continue 吗!!
  • 首先,你只服用一次,如果这是你想要的没关系,但除非例外,否则没有中断条件。
  • 而且我认为它会抛出 NumberFormatException,而不是 InputMismatchException,因为您将字符串转换为导致 NumberFormatException 的 int

标签: java while-loop try-catch


【解决方案1】:

使用以下形式的东西(不完全是 Java 来解决你的作业问题)

 boolean validInput = false;
 while (!validInput) {
    .. get input
       .. set validInput = true if no error
    .. catch error 
       .. print try again message
 }

【讨论】:

    【解决方案2】:

    您可以设置一个布尔值,用于确定while 循环是否成功结束。然后在每个循环中,首先假设值为true,当引发异常时,将其设置为false

    boolean success = false;
    
    while(success == false){
        success = true;
        try {
            System.out.println("Enter b value");
            b = s.nextInt();
            System.out.println("Sum of divison is: " + division(a,b));
        }
    
        catch(ArithmeticException e) {
            System.err.println("Dont divide by zero!!!");
            success = false;   
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 while 循环之外定义一个布尔值,并将其用于 while 的条件。

      假设我正确理解了您的问题,如果用户的输入引发异常(即输入无效),您希望留在循环中,并且您希望在从用户获得有效输入时跳出循环。

      boolean gotValidInput = false;
      while (!gotValidInput) {
          try {
      
              System.out.println("Enter b value");
              b = s.nextInt();
              gotValidInput = true;
              System.out.println("Sum of divison is: " + division(a,b));
      
      
          } catch(ArithmeticException e) {
              System.err.println("Dont divide by zero!!!");       
          } catch (java.util.InputMismatchException e) {
              System.err.println("Enter just a Number!!!");
          } finally {
              System.out.println();
          }
      }
      

      在这个实现中,你的两个异常都会在 gotValidInput = true; 被评估之前被抛出,所以只有在没有抛出异常的情况下才会被设置为 true。

      【讨论】:

        【解决方案4】:

        你可以放额外的外循环,比如

            while (true) {
              System.out.println("Enter a value: ");
              a = s.nextInt();
              while(true) {
        
        
                /// terminate the loop in case of problem with a, and allow a user to re done
              }
            }
        

        【讨论】:

          【解决方案5】:

          清理警告并将s移到main方法之外,并将其定义为static。如果在 main 中并且永远不会关闭,则 s 似乎是资源泄漏。

          import java.util.InputMismatchException;
          import java.util.Scanner;
          
          public class whilePerjashtim {
          
              private static Scanner s;
          
              public static int division(int a, int b) {
          
                  return a / b;
              }
          
              public static void main(String[] args) {
          
                  int a, b;
          
                  s = new Scanner(System.in);
          
                  System.out.println("Enter a value: ");
                  a = s.nextInt();
          
                  boolean input = false;
          
                  while (input == false) {
          
                      try {
          
                          System.out.println("Enter b value");
                          b = s.nextInt();
          
                          System.out.println("Sum of division is: " + division(a, b));
          
                          input = true;
                      }
          
                      catch (ArithmeticException e) {
                          System.err.println("Don't divide by zero!!!");
                      }
          
                      catch (InputMismatchException e) {
                          System.err.println("Enter just a Number!!!");
                      }
          
                      finally {
                          System.out.println();
                      }
          
                  }
          
              }
          }
          

          【讨论】:

            【解决方案6】:

            如果您希望 while 循环正确继续,您还需要处理错误输入:您需要在每个 catch 块的末尾删除错误输入。添加 continue 只会使循环再次运行,直到用户提供正确的输入。

            catch (InputMismatchException e)
            {
                System.err.println("Enter just a Number!!!");
                //add this
                s.nextLine();
                continue;
            }
            

            【讨论】:

              猜你喜欢
              • 2014-08-02
              • 2013-12-15
              • 1970-01-01
              • 2014-03-17
              • 1970-01-01
              • 2021-12-13
              • 2011-12-05
              • 2014-05-11
              • 1970-01-01
              相关资源
              最近更新 更多