c++2015-2019存在异常_Java异常的面试问题及答案-Part 3

14.提供一些Java异常处理的最佳实践。

答:有关Java异常处理的相关最佳实践如下:

  • 使用具体的异常方便调试
  • 程序中早点抛出异常
  • 捕获异常后先让调用者处理异常
  • 使用Java 7 ARM功能确保资源关闭或者用finally子句正确地关闭它们
  • 为了调试需要总是记录异常信息
  • 用多个catch子句实现更完全的关闭
  • 你自己的应用API中用自定义的异常来抛出单种类型异常
  • 遵循命名规定,以异常结束
  • 在Javadoc中用@throws来标注方法抛出的异常
  • 处理异常是有花销的,因此只有在必要时才抛出。否则,你会扑空或毫无收获。

15.下面的程序中有什么问题,该怎么去修改?

答:这里将针对一些跟异常相关的编程问题:

A.下面这段代码有什么问题呢?

3c7c576680ec64268f5cebd6f0f19166.png

上面这段代码将不能被编译,并且会得到:The exception FileNotFoundException is already caught by the alternative IOException这样的错误信息,这是因为FileNotFoundException是IOException的子类。有两种方法来解决此问题:第一种是用两个catch子句来处理这两个异常。代码如下:

784bd519af96195acad8b560732633c1.png

另一种方法就是在catch子句中移除FileNotFoundException,只用IOException。如:

922dccfac9eb0d578fa27d541e561116.png

你可以根据自己的catch子句情况选择上面的任一方法。

B.下面这段代码又有什么问题呢?

4072bf34f90d2757ed8ed3eda2537a9c.png

跟A代码一样,代码将不能编译,因为FileNotFoundException是IOException的子类,所以,FileNotFoundException的catch子句将被隐藏,同时,你会得到这样的:Unreachable catch block for FileNotFoundException.的错误信息。因为异常已被IOException的catch子句处理。你需要改变catch子句的顺序来修复程序。代码如下:

c7620c99e3edaf34dd70248bd1d23e68.png

JAXBException跟FileNotFoundException和IOException不相关,它能放在catch块层级的任何位置。

C.下面的代码同样存在问题。

f3cffdd6086127ff742c3170fea4204d.png

这段代码同样不能编译,因为JAXBException是个受检查的异常,而foo方法应该抛出此异常供调用方法捕获。你将会得到:Unreachable catch block for JAXBException这样的错误信息。这个异常不可能从try子句中抛出。为解决这个错误,只能将JAXBException从catch子句中移除。

也要注意到,NullPointerException的异常捕获是有效的,因为它是个不被检查的异常。

D.下面的代码存在什么问题呢?

14a1c5a70a035bdf10f740f21aa3d00a.png

这代码是个幌子,根本没问题,能被正确编译。我们能捕获到一般异常或者是不被检查的异常,即使在throws语句中没被提及。

同样,如果程序中的一个方法foo()在throws中声明了不被检查的异常,程序中也不一定要处理这个异常。

E.下面这段代码同样存在瑕疵。

7f353fd38190d880b305715b0f0fb637.png

这段代码不能被编译,因为父类中start的方法签名与子类中的start方法签名不相同。为纠正这错误,我们可以修改子类的方法签名使之与超类相同,我们也可以像下面代码那样移除子类中throws关键字。

fadcfa8c8a618b2b1672f77e93b4346d.png

F.下面的代码存在什么问题呢?

9c734b0f4a2505fec79003681a1123ad.png

这段代码同样不能编译,因为在多个catch子句中的异常对象是不可变的,我们不能改变其值。你会得到这样的:The parameter e of a multi-catch block cannot be assigned编译时错误信息。我们需要删掉将e赋值给新异常对象这句来修正错误。

81f939595031f8a5f575cc05873f43d9.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值