【问题标题】:How do I Throw an IllegalArgumentException that won't terminate my program?如何抛出不会终止我的程序的 IllegalArgumentException?
【发布时间】:2016-07-22 17:45:07
【问题描述】:

好的,所以我有一个带有 switch 语句的方法,但我忽略了其余的情况,因为它们并不重要。在我的 main 方法中,调用运算符方法并在 while 循环中传递参数“selection”,直到他们选择“Q”。

当用户输入一个负数时,它应该抛出一个异常,打印一条消息,并忽略他们的输入,然后循环回到开头。当抛出此异常时,它会终止程序。任何帮助将不胜感激。谢谢!

public static void operator(String selection) throws IllegalArgumentException{
    Scanner input = new Scanner(System.in);
    double price;
switch(selection){
case "A":
     System.out.println("Enter the price");
        if(input.nextDouble()<0){
            throw new IllegalArgumentException("Price cannot be a negative value");
        }
        else{
            price = input.nextDouble(); 
        }
break;

case"Q":
  System.exit(0);
}
}

【问题讨论】:

  • 你应该在你的调用类中处理异常

标签: java exception try-catch throw


【解决方案1】:

IllegalArgumentException 继承自 RuntimeException,因为它不会停止您的程序,您可以使用简单的 try{} catch {},但我不建议使用 Runtime Exceptions 这样做。如果是这种情况,请创建您自己的继承自 java.lang.Exception 的异常。

你可以在这里使用 try catch。

这样的事情应该可以工作:

public static void operator(String selection) {
Scanner input = new Scanner(System.in);
double price;
switch(selection){

case "A":
 System.out.println("Enter the price");
     try {
        if(input.nextDouble()<0) {
            throw new NegativePriceException();
        }
     } catch (NegativePriceException e) {
        System.out.println("The price can't be negative.");
        e.printStackTrace();
     }

    price = input.nextDouble(); 
    break;

case"Q":
  System.exit(0);
}
}

并且要创建自己的 Exception 类,您基本上需要从 Exception 继承(如果您想对其使用 try catch)或从 RuntimeException 继承(如果您希望它停止程序运行),如下所示:

public class NegativePriceException extends Exception {

  public NegativePriceException() {
     super();
  }
}

【讨论】:

  • 非常感谢您这么快就回来了。这确实有效,但是,如果输入无效,我需要抛出异常。我认为创建自定义异常将是我最好的选择。你能引导我朝着正确的方向前进吗?
  • 添加了如何创建自己的异常并编辑代码以使用 try catch 而不是 while。
  • 没问题的人,只需评估对您最有帮助的答案。
【解决方案2】:

Java 要求您处理或声明所有异常。如果您没有使用 try/catch 块处理异常,则必须在方法的签名中声明它。

在你的主要方法中你应该处理异常

public static void main(String args[]) {
//codes
try{
operator("A");
}
catch(IllegalArgumentException e){
e.printStackTrace();
}
}

【讨论】:

    【解决方案3】:

    关于如何处理异常,您已经得到了一些很好的答案。

    对于您的情况,我认为例外情况根本不合适。您应该完全摆脱异常,只需通过打印错误消息并要求新输入来处理问题输入。

    异常是针对特殊情况的,它们不应该是代码正常执行的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2017-12-15
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多