Java异常面试题


JAVA异常

一、如何处理异常

1、捕获异常
将业务代码包裹在try块内部,当业务代码中发生任何异常时,系统都会为此异常创建一个异常对象。创建异常对象之后,JVM会在try块之后寻找可以处理它的catch块,并将异常对象交给这个catch块处理。
2、处理异常
在catch块中处理异常时,应该先记录日志,便于以后追溯这个异常。然后根据异常的类型、结合当前的业务情况,进行相应的处理。比如,给变量赋予一个默认值、直接返回值、向外抛出一个新的业务异常交给调用者处理,等等。
3、回收资源
如果业务代码打开了某个资源,比如数据库连接、网络连接、磁盘文件等,则需要在这段业务代码执行完毕后关闭这项资源。并且,无论是否发生异常,都要尝试关闭这项资源。将关闭资源的代码写在finally块内,可以满足这种需求,即无论是否发生异常,finally块内的代码总会被执行。

二、Java的异常接口

Throwable是异常的顶层父类,它有俩个子类,分别是Error、Exception。
1、Error:
由于JVM或硬件引发的严重问题,无法通过程序代码捕获和处理,所有错误的类名都以Error结尾
VirtualMachineError—虚拟机错误
OutOfMemoryError—内存超出错误
StackOverflowError—栈溢出错误
2、Exception:
需要通过程序代码捕获和处理,所有异常的类名都以Exception结尾
(1)运行时异常—RuntimeException
如果一个方法内部抛出了一个运行时异常,则编译器不要求必须捕获处理,也不要求必须声明抛出,对方法的调用方也没有强制要求运行时异常是程序运行以后,因为错误的数据或操作导致的异常,如果程序员具有良好的编程习惯,在程序代码中增加对错误的检查操作,就可以避免发生运行时异常。如:
ArithmeticException—算术异常
ClassCastException—类型转换异常
IndexOutOfBoundsException—下标越界异常
ArrayIndexOutOfBoundsException—数组下标越界
StringIndexOutOfBoundsException—字符串下标越界
NullPointerException—空指针异常
NoSuchElementException—无此元素异常
(2)非运行时异常(又叫编译时异常)—除了RuntimeException及其子类以外的所有异常
如果一个方法内部抛出了一个编译时异常,则编译器要求该方法要么使用try-catch语句捕获并处理,要么在方法原型上使用throws声明可能抛出该异常,否则编译无法通过编译时异常无法通过良好的编码习惯避免,如果不处理,肯定会导致程序出错。如:
ClassNotFoundException—类没找到异常(JDBC部分)
InterruptedException—线程中断异常(线程部分)
IOException—FileNotFoundException—文件没找到异常(IO部分)
SocketException–网络通信异常(网络部分)
NoSuchMethodException—无此方法异常(反射和框架部分)
ParseException—数据解析异常
SQLException—SQL异常(JDBC部分)

三、finally块

1、finally块中的代码,无论是否产生异常,最终都会执行,这样可以保证文件资源,数据库连接,网络连接资源在任何情况下都会被释放
2、 finally块不能单独使用,必须配合try块
3、 finally块的代码在任何情况下都会执行的,遇到return语句,也会在方法返回前执行除非调用System.exit()方法退出程序

四、throw和throws的区别

1、throw出现在方法内部真实抛出一个异常对象
2、throws出现在方法原型后面,声明该方法可能抛出的异常类型,可以有多个,用逗号分隔

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值