Java 爪哇语;“未处理的异常”;尽管它';他真的处理了

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

我有一个类似于下面的设置。在AClass中,
行中的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();
    }
}