我已经创建了一个我想在我的应用程序中使用的自定义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,那么为什么会出现这个错误?
答案 0 :(得分:5)
显然,你没有做任何,而是生成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
}
答案 1 :(得分:4)
您创建的异常是一个已检查的异常,必须从某处抛出才能捕获它。
由java开发人员通过扩展Exception
类创建的任何异常都是一个经过检查的异常。适用于已检查例外的规则将适用于此类例外情况。
另一种形式的异常称为未经检查的异常,通常通过扩展RuntimeException
类来创建。开发人员可以自由地捕获此类异常,而无需将其从代码中抛出。
类异常也不会被抛出。我只是希望MyException的行为类似于
Exception
。
这是其中一条评论中进一步提出的问题:
我对此的看法是,您可以将Exception
类视为一个大容器,它定义了许多不同且唯一(对点)的子例外。大多数这些细粒度的异常都是从Java Code中抛出的。在抽象层次结构中,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
类。因此,您无法将Exception
中的MyException
替换为{{1}}。
答案 2 :(得分:2)
你可以尝试:
try {
System.out.println("this");
throw new MyException();
} catch (MyException e) {
// TODO: handle exception
}
您的异常未在代码中的任何位置抛出。 (尝试将RuntimeException
扩展为另一种选择)
答案 3 :(得分:1)
编译时错误说的是正确的“此异常永远不会从try语句主体中抛出”。你没有任何抛出MyException