java异常相关面试题

1、异常类结构(天灾人祸)

Throwable是所有java程序中错误处理的父类,它可以分为两种子类:Error和Exception。

Error属于天灾,是无法预知的错误,属于JVM层次的严重错误,一般不需要捕捉和修复;

Exception属于人祸,是所有异常的父类,是程序的异常,一般可以修复,除了RuntimeException外都是检查性异常。

检查性异常(ckecked,有后遗症的):如果不处理的话编译不能通过(IOException,SQL异常或自定义异常。。。FileNotFoundException。。。),所以我们必须捕获此类异常,并为用户提供有用信息和合适的日志进行调试;

非检查性异常:又称不受检查异常,就是运行时异常,源于糟糕的编程。用户可以不处理,当出现这样的异常时,总是由虚拟机接管。如:没有确定好数组的长度,可能会抛空指针异常(NullPointException,ClassCastException,NumberFormatException,IndexOutOfBoundsException。。。)这些异常我们没有去处理过。

 

2、常见的异常

NullPointException:空指针异常,对象是null时会抛出,在调用传入对象时尽量判断是否为null,Jdk8里面可以用Optional对象来避免

IndexOutOfBoundsException:数组下标越界,数组的下标超过了最大值时会抛出,在迭代循环时检查下标是否越界

NumberFormatException:数字类型转化异常,将非数字类型转成数字类型,将类型转化的代码catch住

ClassCastException:类型转换异常,发生在强转时,将不同类型转成同一类型,尽量少用强转,或用instanceof(判断继承中子类的实例是否是父类的实现)做类型判断,或多用泛型

FileNotFoundException:找不到指定文件,文件路径错误或文件不存在,可能用了绝对路径检查文件是否存在,路径是否写错,多用相对路径

ClassNotFoundException:在classpath中找不到引用的类缺乏引用当前类的jar或没有设置classpath或jar损坏-,找到jar并放入classpath中或检查jar是否损坏

OutOfMemoryError:内存溢出异常,产生对象太多,内存不够->不要在循环体重创建大量对象,或对象及时回收,增大初始化堆:-Xms 增加最大值:-Xmx

NoClassDefFoundError:找不到相应的类错误,缺乏当前引用类的jar或jar版本不对->找到jar并放入classpath中或找到合适的版本

ConcurrentModificationException:并发修改异常,在集合迭代时修改里面的元素->在迭代时不要修改集合或用并发集合做遍历(如:ConcurrentHashMap)

NoSuchMethodError:类里找不到相应的方法,一般是jar版本不对,当前引用的jar版本中没有这个方法->检查jar版本是否正确

UnsupportedClassVersionError:版本不支持错误,编译class的jdk和运行时候的jdk版本不一致或比较高->将低版本换成高版本

StackOverflowError:栈溢出错误,一般是函数的死循环,或递归调用无法退出->检查死循环的代码,或让递归有退出值,或加大栈初始化参数

 

3、异常打印信息组成

所处线程名字、异常类名、异常信息、异常堆栈、异常的源码,包名,类名,方法名,行数

 

4、java中两种处理方式

一:通过try catch捕捉异常,顺序上先处理子类异常后父类,非特殊情况catch中不能为空,要处理错误,避免使用catch all(不能很准确的定位错误),尽量用catch,jdk7中可以处理并列异常,这个方法虽然简洁,但是也不够好(不同异常处理方法是一致的;多个异常间必须是平级关系)。清理数据必须放到finally里面,无论是否抛异常,或try中有return语句,finally里面的代码一定会执行,除非碰到System.exit(0)(艾克色特)

二:通过throws抛出异常,子类方法中抛出的异常应该是与父类方法中相同,或是父类异常的子类;一定要在main方法里面处理异常,不然jvm可能就退出了

 

5、常见方法

getMessage:错误信息的字符串解释

getCause:返回异常产生的原因,一般是原始异常如果不知道原因返回null

printStackTrace:打印异常出现的位置或原因

toString:返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息

initCause:初始化原始异常

PrintStream和PrintWriter作为产生实现重载,这样就能实现打印栈轨迹到文件或流中

 

6、如何自定义异常

继承Exception是检查性异常,继承RuntimeException是非检查性异常,一般要复写两个构造方法,用throw抛出新异常

如果同时有很多异常抛出,那可能就是异常链,就是一个异常引发另一个异常,另一个异常引发更多异常,一般我们会找它的原始异常来解决问题,一般会在开头或结尾,异常可通过initCause串起来,可以通过自定义异常

 

7.注意事项

异常会中断程序正常流程,异常比较耗性能,好的项目都有自定义异常

  

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值