![](/img/trans.png)
[英]Java web app redirect to URL depending on where the request came from
[英]Where do Java exceptions came from?
到目前为止,我认为每个Java异常都必须由构造函数创建,因为我可以自己创建自定义异常:
throw new Exception();
但是现在看来,我必须处理JavaMail- MessagingException中的某些异常。 它来自Store.close
方法(从Service
类继承)。
我去了那里(我需要检查何时引发该异常,以便知道什么地方可能出了错),并且我看到该方法调用了另外两个方法-它们都不抛出异常!
public synchronized void close() throws MessagingException {
setConnected(false);
notifyConnectionListeners(ConnectionEvent.CLOSED);
}
据我了解,这是检查的异常(Error和RuntimeException均未检查),那么怎么可能不必在close
方法命令使用的任何方法中都声明它? 在此方法中,也不会在此处创建它。
声明的异常与实现可能引发的异常无关,而是与该实现或子类 中的实现可能引发的异常有关。 Service
是一个抽象类-JavaMail实现的两个直接子类( Transport
和Store
)也是如此。 即使这些覆盖都不覆盖close()
,您使用的具体实现也有可能覆盖close()
并且其实现也可能抛出MessagingException
。
从API设计的角度来看有意义吗? 我必须更仔细地研究JavaMail才能做出任何判断,而且值得庆幸的是,我已经很长时间没有使用JavaMail了。
从语言的角度来看有意义吗? 绝对。 拥有一个不抛出特定检查异常的实现,但是期望具体的子类可能需要这样做是完全合理的。
关于方法声明的JLS说
声明检查异常的要求使Java编译器可以确保已包含用于处理此类错误情况的代码。 如果方法或构造函数无法处理作为主体中的检查异常引发的异常条件,则如果它们在throws子句中缺少适当的异常类型,通常会导致编译时错误。 因此,Java编程语言鼓励采用这种编程方式,在这种方式下,以这种方式记录了罕见的条件,或者说是真正的例外情况。
基本上,如果没有处理异常,则可以确保代码不会编译。 因此,即使未在此实现中抛出它,它也可能在子类中。
阅读整页以获得更多详细信息。
public class Mother{
public foo() throws Exception{
system.out.println("I am mother");
}
}
public class Daughter extends Mother{
@Override
public foo() throws Exception{
throws new Exception("I am a teenager !!");
}
}
由于这是允许的
Mother m = new Daughter();
您松开了实例的真实类型,所以幸运的是,如果您这样做,编译器会尖叫
m.foo(); //will not compile
请注意,如果子类中被重写的方法需要throws
某些东西,那么您就无法从母亲那里获得没有任何throws
声明的方法。 禁止,您不能在子类throws
声明中添加或使用异常的超类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.