我有一个单独的JAR库,其中包含一组抛出自定义异常的方法,例如:
public String methodName() throws CustomException {
// code here
}
然后我将JAR添加到类路径中,并在源代码的try语句中引用库方法:
try {
DemoClass demoClass = new DemoClass ();
demoClass.methodName() // this should throw a CustomException if something occurs
} catch (CustomException e) {
// something here
}
上面的代码片段不断返回以下编译错误:
从不在相应的try语句
的主体中抛出CustomException
如果方法在本地上下文中(未打包在JAR中)代码可以工作..那么我的问题是,是否可以从JAR库中“抛出”自定义异常?
答案 0 :(得分:2)
你应该避免使用“class”,因为它是一个保留的关键字。
try {
MyClass myClass = new MyClass();
myClass.methodName() // this should throw a CustomException if something occurs
} catch (CustomException e) {
// something here
}
另外,请确保从同一个jar中导入“MyClass”和“CustomException”,并且您的代码段和“MyClass”从同一个包中导入“CustomException”。
答案 1 :(得分:1)
你的类是在jar中还是在本地上下文中并不重要,它总是会抛出异常。您应该检查您是否正在使用该类并调用您想要的方法,而不是其他类和其他具有相同名称的方法。
我的预感类似于ParseException
同时位于java.text.ParseException
和org.apache.commons.cli.ParseException
,当demoClass.methodName()
实际抛出前者时,您可能会在代码中导入后者并试图抓住它,这就是编译器所抱怨的。您可能想要检查CustomException存在的所有位置,并且您正试图捕获正确的位置。
答案 2 :(得分:0)
问题是CustomException
是一个经过检查的异常,但是编译器看到DemoClass.methodName()
的版本没有声明作为抛出该异常。编译器然后推断出,因为方法的签名不允许抛出异常,所以不能抛出。
如果您希望能够在那里捕获该已检查的异常,那么异常(或超类)必须包含在您编译的类的方法声明的throws
子句中。
MyClass和customException未从同一个JAR导入,这是问题吗?
本身不是 。
但是,我怀疑你实际上在两个JAR中有两个不同(不兼容)的相关类或接口版本。那将是一个错误。即使您设法将其编译,由于签名冲突,您很可能会遇到类加载器问题。