大家好,欢迎来到IT知识分享网。
Java中常常弄混的两个关键字,throw和throws,它们有什么区别呢?如何记忆他们,而不至于出错呢?
区别
throws:出现在方法的签名中,声明当前方法可能抛出的所有异常,语法格式如下:
throws Exception1, Exception2, ...
throw:可以出现在任何代码块中,是一个动作,抛出某个异常,语法格式如下:
throw new Exception();
我们可以发现,throws在声明可能抛出的异常的时候,后边跟的是异常类,可以可以跟多个异常类,每个类用逗号隔开;而throw在”抛出”(动作)一个异常的时候,后边跟着的是某个异常的实例(对象),并且只能抛出一个实例,这是因为抛出一个异常后,后边的异常都必定是不可达的,所以抛出多个异常时没有意义的。
为什么要有两个throw(s)呢?
这和java的异常机制有关,对于受检(Checked)异常,有两种选择:1)在异常抛出的地方进行捕获(catch);2)如果本地处理不了,可以选择向上抛出,那么,在方法签名后边的throws Exception就表示该方法体内的Exception暂时处理不了,需要抛到方法外,让其他方法去捕获和处理。
如上简单的例子所示,如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。
JVM对异常的处理方法是,打印异常的跟踪栈信息,并中止程序运行。
利用IDE(IntelliJ IDEA)的提示功能,我们可以很清晰地看到这一点。
1)对于方法中没有throw异常,或者异常已经在方法体内catch,这时throws声明抛出异常,对于使用该方法的外部方法,仍然是需要catch该异常的。这是有意义的,虽然实际是不可能由异常抛出,但是对于像不能轻易改动的类库或者接口,预先声明可能抛出的异常,可以在未来实际加上,而且不对现有的客户代码带来影响;(大家可以思考下,如果类库开发者,随意加上throws,对我们使用者来说,有什么影响)
2)对于方法中throw的异常没有在原地进行捕获(catch),这将会是语法错误,Unhandled exception,未处理的异常。编译器禁止该代码编译。这是非常聪明的做法,因为如果此时不声明throws抛出的异常,那么外部方法按语法来说,也可以不catch该异常,就这样一级一级向上抛,直到程序中止。
RumtimeException就是这样的异常,和受检(Checked)异常不同,该类型异常表示运行时异常,是被认为不可恢复的异常,不需要throws,直接程序中止,让程序员及时修改bug。
如何记忆呢?
对于现在使用IDE的联想功能,一般都不会出错,但是如果面试遇到这个问题,就会懵逼了。我总结下来,凡是在声明处的“动词”关键字,都是单数的throws,例如,extends,implements.
如果我的文章对你有帮助,请关注我,点个赞,谢谢~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13161.html