Custom Exception类每次都显示Unreachable catch块



我已经创建了一个自定义的Exception类,我想在我的应用程序中使用它:

public class MyException extends Exception {
private static final long serialVersionUID = -2151515147355511072L;
private String message = null;
public MyException() {
super();
}
public MyException(String message) {
super(message);
this.message = message;
}
public MyException(Throwable cause) {
super(cause);
}
@Override
public String toString() {
return message;
}
@Override
public String getMessage() {
return message;
}
}

但当我尝试使用这个类时,就像下面一样,它会在编译时出错。

try {
System.out.println("this");
} catch (MyException  e) {
// TODO: handle exception
}

编译时错误:

Unreachable catch block for MyException . This exception is never thrown from the try statement body

我的问题是,如果我正在扩展Exception类&在所有构造函数中调用super,那么为什么会出现此错误?

显然,您没有执行任何会生成MyException操作。首先写一个签名为throws MyException的方法,调用它,然后问题就解决了。这里有一个例子:

public void someMethod()throws MyException
{
//some condition here.
//if met..
throw new MyException("cause");
}

并将您的主代码修改为:

try {
someMethod();
System.out.println("this");
} catch (MyException  e) {
// TODO: handle exception
}

您创建的异常是一个已检查的异常,必须从某个地方抛出才能捕获它。java开发人员通过扩展Exception类创建的任何异常都是已检查异常。适用于检查异常的规则将适用于此类异常。

另一种形式的异常称为Unchecked exception,通常通过扩展RuntimeException类来创建。开发人员可以自由地捕捉这样的异常,而无需将其从代码中抛出。

类异常通常也不会抛出。我只想让MyException表现得像Exception

这是其中一条评论中进一步询问的内容:

我的看法是,您可以将Exception类视为一个大型容器,其中定义了许多不同且唯一(到目前为止)的子异常。这些细粒度异常大多是从Java代码中抛出的。在抽象层次结构中,Exception位于更高的级别(不是最高级别,因为Throwable位于那里)。此外,作为一名开发人员,我们总是对更精细的细节感兴趣,比如抛出了什么样的异常。然而,在处理异常时,我们有时会编写

try{
//some code lets assume throws IOException
//Some code lets assume throws FileNotFoundException
}
catch (Exception ex) {
//common handling which doesn't care if its IOException or FileNotFoundException
}

您不能仅通过写入MyException extends Exception来干预此异常层次结构。这样一来,你所做的就是你的MyExceptionException的一种类型,而不是Exception类。因此,您无法用MyException替换捕获的Exception

你能试试吗:

try {
System.out.println("this");
throw new MyException();
} catch (MyException  e) {
// TODO: handle exception
}

您的异常没有在代码中的任何位置引发。(尝试扩展RuntimeException作为另一个选项)

编译时错误所说的是正确的"这个异常从未从try语句体中抛出"。你没有投掷MyException的任何东西

最新更新