自定义异常类每次都显示无法访问的catch块

时间:2014-03-01 15:18:09

标签: java exception

我已经创建了一个我想在我的应用程序中使用的自定义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,那么为什么会出现这个错误?

4 个答案:

答案 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

的东西