如何处理“此异常永远不会从try语句体中抛出”

时间:2016-01-04 13:50:17

标签: java exception

错误消息:永远不会从try语句主体抛出此异常。

这里显示了一个java程序:

class err1 extends Exception {}

class Obj1 {
    Obj1() throws err1 {
        throw new err1();
    }
}

class Main {
    public static void main(String[]argv) {
        Class a[] = {Obj1.class};
        try {
            a[0].newInstance();
        } catch(err1 e) { //Here meet my error
        }
    }
}

我该怎么做才能处理它? 不要告诉我将catch(err1 e)替换为catch(Exception e),因为我的Eclipse不知道可以抛出异常。

此外,当我启动它时,发生了如下事情。

Exception in thread "main" java.lang.Error:Unresolved compilation problem:
Unreachable catch block for err1. This exception is never thrown from the try statement body
然后我突然知道自己要做什么......

2 个答案:

答案 0 :(得分:2)

反射方法newInstance()除其他外引发InstantiationException。如果在构造函数中遇到任何类型的异常,则抛出此异常。您需要捕获那个,并使用err1类中的适当方法抽象InstantiationException

newInstance()本身并不知道您的特定例外情况,而是将其封装在InstantiationException中。

答案 1 :(得分:0)

Exception类型在编译时是未知的,因为任何东西都可以包含在Class数组中。

您可以做的是检查catch块中的类型:

public class Example {
    public static void main(String[] args) {
        Class a[] = {Obj1.class};
        try {
            a[0].newInstance();
        } catch (Exception e) {
            if(e instanceof CustomException) {
                System.out.println("CustomException");
            }
        }
    }
}

class Obj1 {
    Obj1() throws CustomException {
        throw new CustomException();
    }
}

class CustomException extends Exception {

}

无法提及:如果您遵守普遍接受的编码/命名/格式约定,则对其他人非常有帮助。