5

我目前正在学习如何正确执行自定义异常,但偶然发现了一个问题。每当我尝试使用引发此自定义异常的类的对象时,我的 IDE 调试器(我正在使用 IntelliJ 想法)都会显示“未处理的异常:InsertExceptionName()”。代码以简化的方式看起来像这样。在这种情况下,如果随机生成的数字<0.5,它应该返回一个异常,否则返回一个数字,但它不会那样做。我错过了什么?

public class main {
    public static void main(String[] args) {
        double x=Math.random();
        operation op=new operation();
        op.execute(x);
   }
}

-

public class operation {
    public operation() {
    }

    public double execute(double x) throws RandomWeirdException {
        if(x<0.5) {
            throw new RandomWeirdException("<0.5");
        }
        return x;
    }
}

-

public class RandomWeirdException extends Exception{
    public RandomWeirdException() {
        super();
    }
    public RandomWeirdException(String message) {
        super(message);
    }
}
4

2 回答 2

10

您是什么意思“返回”异常?当抛出异常时,它会在调用堆栈中冒泡。

在这种情况下,您没有处理它。它到达main,因此您有一个未处理的异常。

如果你想处理一个异常,你会使用一个try-catch块。main在这种情况下最好环绕。

try {
    // Code that might throw
    // an exception.
} catch (Exception e) {
    // Handle it.
}

另一种解决方案是指定main抛出一个“ RandomWeirdException”,而不是一开始就抛出catch它。

public static void main(String[] args) throws RandomWeirdException { ... }

最好只使用 let functions throw,除非您可以合理地处理异常情况。如果你只是catch为了捕捉而在特殊情况下没有做任何有意义的事情,这相当于有时隐藏错误。

于 2015-01-11T18:35:09.423 回答
0

您正在使用该execute方法,而没有为其RandomWiredException声明它正在抛出的 try-catch 块创建。ExceptionJava 要求调用者正确处理所有已检查的异常(extend ) - 使用 try-catch 块,或者通过添加throws到调用方法(在这种情况下,它是main,所以它不应该有throws子句)。

所以正确的做法是:

public class Main {
    public static void main(String[] args) {
        double x=Math.random();
        operation op=new operation();
        try {
            op.execute(x);
        } catch ( RandomWiredException e ) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

当然,catch 子句中的实际代码取决于您的应用程序的要求。

注意:命名类时使用大写首字母。这是可以提高代码可读性的 Java 样式约定之一。

于 2015-01-11T18:38:15.020 回答