异常处理
1.1 finally块中的代码什么时候执行
finally代码块的作用就是为了保证无论出现什么情况,finally中的代码一定会执行,在return前执行。如果try-finally或者catch-finally中都有return,那么finally块中的return语句将会覆盖别处的return语句;
引申:
出现在java中的finally块中的代码不一定会被执行
- 当程序在进入try语句块之前就出现异常时,会直接结束,不会执行finally块中的代码;
- 当程序在执行try中强制退出时也不会执行finally块中的代码;
1.2 异常处理的原理是什么?
异常是指程序运行时所发生的非正常情况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并且抛出,这个异常在catch程序块中进行捕获,然后进行处理,异常处理的目的是为了提高程序的安全性与鲁棒性。
Java中把异常当对象来处理,并且定义了一个基类(java.lang.Throwable)作为所有异常的父类,这些异常类分为Error(错误)和Exception(异常)。Error、Exception和RuntimeException都是Throwable,都可以用throw抛出;
违反语义规则包括两种情况:一种是Java类库中内置的语义检查,例如当发生数组越界时,会引发IndexOutOfBoundsException,当访问null对象时,会引发NullPointerException;另一种情况是Java允许开发人员扩展这种语义检查,开发人员可以创建自己的异常类(所有异常都是Java.lang.Throwable的子类),自由选择在何时用throw关键字抛出异常;
1.3 运行时异常和普通异常有什么区别
Java提供了两种错误的异常类,分别是Error和Exception,都拥有一个父类——Throwable;
Exception表示可以恢复的异常,是编译器可以捕获的,包含两种类型:检查异常(checked exception)和运行时异常(runtime Exception);
-
checkedException发生在编译时期,必须要使用try…catch(或者throws),否则编译不通过,Java编译器会强制编译器去捕获此类型的异常,把对异常处理的代码放到catch块中,这种异常情况通常是在以下情况中使用:
1、异常的发生不会导致程序出错,进行处理后还可以继续执行后面的操作;
2、程序依赖于不可靠的外部条件,例如系统IO; -
运行时异常:编译器没有对其进行强制捕获处理,不对其进行处理,会由JVM进行处理。出现运行时异常时,系统会把异常一直往上层抛,直到遇到处理代码为止;多线程就采用Thread.run()方法抛出,单线程就用main()方法抛出;
1.4 常见的异常
NullPointerException(空指针异常)、ClassCastException(类型转换异常)
ArrayIndexOutOfBoundException(数组越界异常)、ArrayStoreException(数组存储异常)
BufferoverflowException(缓冲区溢出异常)、ArithmeticException(算术异常)
1.5 throw和throws有什么区别?
throw关键字用来在程序中明确的抛出异常,throw用来表明方法不能处理的异常。每个方法都必须指定哪些异常不能处理,所以方法的调用者才能够保证可能发生的多个异常,多个异常用逗号间隔。