我已经创建了一个自定义的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
来干预此异常层次结构。这样一来,你所做的就是你的MyException
是Exception
的一种类型,而不是Exception
类。因此,您无法用MyException
替换捕获的Exception
。
你能试试吗:
try {
System.out.println("this");
throw new MyException();
} catch (MyException e) {
// TODO: handle exception
}
您的异常没有在代码中的任何位置引发。(尝试扩展RuntimeException
作为另一个选项)
编译时错误所说的是正确的"这个异常从未从try语句体中抛出"。你没有投掷MyException
的任何东西