Java基础——异常处理

参考Java程序员面试笔试宝典:

目录

1.finally块中的代码什么时候被执行

2.异常处理的原则是什么

3.运行时异常和普通异常有什么区别


1.finally块中的代码什么时候被执行

在java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。

任何语句要执行都只能在return前执行(除非遇到exit函数),因此fianlly块里的代码也是在return前执行。

当finally块里有return语句,将会覆盖函数中其他return语句。

由于方法内部定义的变量都存储在栈中,当函数结束,对应栈会被回收,方法体内定义的变量就不存在了,因此return返回时不是直接返回变量的值,而是复制一份,然后返回。因此对基本数据类型,在finally块里改变return值对返回值没有影响,而对引用类型的数据会有影响。

引申:

问:出现在finally块的代码是不是一定会被执行?

答:不是。当程序进入try语句之前就出现异常,会直接结束,不会执行finally块里的代码;当程序在try块中强制退出时也不会执行,如System.exit(0)

2.异常处理的原则是什么

异常是指程序运行时(非编译时)发生的非正常情况或错误,当程序违反了语义规则时,JVM就会讲其作为一个异常并抛出。这个异常在catch中进行捕获,然后进行处理。

java把异常当成对象来处理,定义了一个基类(java.lang.Throwable)作为所有异常的父类。Java API中定义了很多异常类,分为Error(错误)和Exception(异常)两大类。

违反语义规则包括两种情况,一是java类库内置的语义检查,如数组越界和访问null对象;二是允许java开发人员扩展语义检查,创建自己的异常类,并自由选择在何时用throw关键字抛出异常。

3.运行时异常和普通异常有什么区别

Java提供两种错误的异常类,分别为Error和Exception,有相同父类——Throwable

Error表示程序运行期间出现了非常严重的错误,且不可恢复,会导致程序终止执行。此外,编译器不会检查Error是否被处理,不推荐去捕获Error类型的异常。当这些异常发生时,JVM一般会选择将线程终止。

Exception表示可恢复的异常,编译器可以捕捉到的。它包含两种类型:检查异常(checked exception)和运行时异常(runtime exception)

检查异常:最经常碰到的异常。所有继承自Exception并且不是运行时异常的异常都是检查异常,如IO异常和SQL异常。这种异常发生在编译阶段,把可能出现异常的代码放到try块中,对异常的处理放到catch中。这种异常一般在几种情况中使用:1)异常不会导致程序出错,进行处理可以继续执行后续操作,如数据库连接失败进行重连。2)程序依赖不可靠的外部条件,如系统IO

运行时异常:不同于检查异常,编译器没有强制对其进行捕获处理。如果不对其处理,当出现这种异常,会由JVM来处理,如NullPointException异常,就是运行时异常。

常见的运行时异常:空指针异常、类型转换异常、数组越界异常、数组存储异常、缓冲区溢出异常、算术异常等。

出现运行时异常后,会不断往上层抛出,直到遇到处理代码为之。若没有处理块,则抛到最上层;多线程用Thread.run()方法抛出,单线程用main()方法抛出。若不对运行时异常处理,后果严重,要么线程中止,要么主程序终止。

注意:

1)java异常处理用到了多态的概念,应该先捕获子类,再捕获基类。

2)尽早抛出异常,并进行处理,或从错误中恢复,或让程序继续执行。

3)可根据实际需求自定义异常类,继承Exception类即可。

4)异常能处理就处理,不能处理就抛出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值