Java 爪哇语;“未处理的异常”;尽管它';他真的处理了
我有一个类似于下面的设置。在AClass中,Java 爪哇语;“未处理的异常”;尽管它';他真的处理了,java,exception,javac,Java,Exception,Javac,我有一个类似于下面的设置。在AClass中,行中的Java编译器抛出e抱怨- 未处理的异常:.DatastoreException (来自jdoodle-的可编辑共享) 为什么呢?我不是只有在异常为IllegalArgumentException时才抛出吗 import java.lang.IllegalArgumentException; import <path-to>.DependencyException; import <path-to>.DatastoreEx
行中的Java编译器抛出e
抱怨-
未处理的异常:.DatastoreException
(来自jdoodle-的可编辑共享)
为什么呢?我不是只有在异常为IllegalArgumentException时才抛出吗
import java.lang.IllegalArgumentException;
import <path-to>.DependencyException;
import <path-to>.DatastoreException;
public class AClass {
public void someMethod() {
try {
new BClass().thisThrowsDatastoreException();
} catch (Exception e) {
if (e instanceof IllegalArgumentException) {
throw e; //Javac complains in this line
} else if (e instance of DatastoreException) {
throw new DependencyException(e);
}
}
}
}
即使您在检查了
instanceof
之后抛出,这也是一个运行时检查,e
仍然声明为异常
。虽然编译器可以由此推断该行只会抛出IllegalArgumentException
的实例,但它目前并没有这样做(我想将来可能会使用instanceof
模式匹配)
所以,改变
if(IllegalArgumentException的实例){
抛出e;//Javac对此抱怨
}
到
if(IllegalArgumentException的实例){
抛出(IllegalArgumentException)e;
}
即使您在检查了instanceof
之后加入,这是一个运行时检查,e
仍然声明为异常
。虽然编译器可以由此推断该行只会抛出IllegalArgumentException
的实例,但它目前并没有这样做(我想将来可能会使用instanceof
模式匹配)
所以,改变
if(IllegalArgumentException的实例){
抛出e;//Javac对此抱怨
}
到
if(IllegalArgumentException的实例){
抛出(IllegalArgumentException)e;
}
我猜它可能是在抱怨任何调用something()
,而不是您指出的问题所在。你能把它转换成一个代码,这样我们就可以验证它是否按照你的指示工作了吗?它和上面的代码有多相似?因为抛出异常
将始终指示任何异常,包括运行时异常。。。我认为还需要一个测试(是的,是的,只是测试智能标签:P)。注意,在测试之后,编译器仍然不知道e
是IllegalArgumentException
,因为这只是运行时测试过程中发生的结果(我想知道最新版本的Java是否解决了这个问题,嗯)@markspace-我添加了一个JDoodle链接-如果你想检查的话,这个问题在那里被复制了@MaartenBodewes是我添加到问题中的Jdoodle链接中的最小可复制示例。请看看这是否有帮助@尊敬的markspace,不管我假定自己是精神错乱的,我真的很感激你能回答我的实际问题!:)我猜它可能是在抱怨任何调用something()
,而不是您指出的问题所在。你能把它转换成一个代码,这样我们就可以验证它是否按照你的指示工作了吗?它和上面的代码有多相似?因为抛出异常
将始终指示任何异常,包括运行时异常。。。我认为还需要一个测试(是的,是的,只是测试智能标签:P)。注意,在测试之后,编译器仍然不知道e
是IllegalArgumentException
,因为这只是运行时测试过程中发生的结果(我想知道最新版本的Java是否解决了这个问题,嗯)@markspace-我添加了一个JDoodle链接-如果你想检查的话,这个问题在那里被复制了@MaartenBodewes是我添加到问题中的Jdoodle链接中的最小可复制示例。请看看这是否有帮助@尊敬的markspace,不管我假定自己是精神错乱的,我真的很感激你能回答我的实际问题!:)someMethod()
被标记为抛出Exception
,因此,如果系统认为该方法抛出e
类型的Exception
,为什么要抱怨?@markspace-同意,这是一个手动错误。请检查jdoodle链接@Anusha可能不会,但大多数IDE都允许您智能地解决它,因此您可以返回e
,然后让IDE添加强制转换(例如在Eclipse中使用)。可能最好使用catch(IllegalArgumentException e){throw e;}catch(Exception e){throw new DependencyException(e);}
。catch已经为你做了一个实例的检查,为什么在catch里面做得更详细呢?@MarkRotteveel实际上我更喜欢这样someMethod()
被标记为抛出Exception
,因此,如果系统认为该方法抛出e
类型的Exception
,为什么要抱怨?@markspace-同意,这是一个手动错误。请检查jdoodle链接@Anusha可能不会,但大多数IDE都允许您智能地解决它,因此您可以返回e
,然后让IDE添加强制转换(例如在Eclipse中使用)。可能最好使用catch(IllegalArgumentException e){throw e;}catch(Exception e){throw new DependencyException(e);}
。catch已经为你做了一个实例的检查,为什么在catch里面做得更详细呢?@MarkRotteveel实际上我更喜欢这样!
public class BClass {
public BClass() {}
public void thisThrowsDatastoreException() throws DatastoreException {
throw new DatastoreException();
}
}
public class DatastoreException extends Exception {
private static final long serialVersionUID = -2L;
public DatastoreException() {
super();
}
}
public class DependencyException extends RuntimeException {
private static final long serialVersionUID = -1L;
public DependencyException() {
super();
}
}