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

Java 自定义异常类每次都显示无法访问的捕获块,java,exception,Java,Exception,我已经创建了一个自定义异常类,我想在我的应用程序中使用它: public class MyException extends Exception { private static final long serialVersionUID = -2151515147355511072L; private String message = null; public MyException() { super(); } public MyExc

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

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,那么为什么会发生此错误?

您可以尝试以下方法:

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

代码中没有抛出您的异常。(尝试扩展
RuntimeException
作为另一个选项)

编译时错误所说的是正确的“这个异常永远不会从try语句体抛出”。您没有任何抛出MyException的异常。您创建的异常是一个已检查的异常,必须从某个地方抛出才能捕获它。 java开发人员通过扩展
exception
类创建的任何异常都是选中的异常。适用于检查异常的规则将适用于此类异常

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

通常也不会引发类异常。我只希望我的异常行为像
Exception

以下是其中一条评论中进一步提出的问题:

我的观点是,您可以将
异常
类看作是一个大型容器,其中定义了许多不同且唯一的子异常。这些细粒度异常大多是从Java代码中抛出的。在抽象层次结构中,异常位于更高的级别(而不是最高级别,因为,
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
,显然,您没有做任何会生成
MyException
的事情。首先用签名
编写一个方法抛出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
}

您没有在
try
块中执行任何可能抛出
MyException
的操作,请尝试在块中抛出您的异常:
抛出新的MyException()很抱歉我缺乏知识,但是类
exception
的异常通常也不会抛出。我只想
MyException
表现得像
Exception
一样,这很好,而且可能是一个很好的实践,但是您确实需要在代码中的某个地方抛出该异常(异常可能发生的地方!)。调用可以抛出该异常类型的方法(如其他地方所建议的)是一种好方法