异常处理的语法格式:
try{ … } catch(Exception e){ … } finally{ … }
- try:是用来监测可能会出现异常的代码段。
- catch:是用来捕获 try 代码块中某些代码引发的异常,如果 try 里面没有异常发生,那么 catch 也一定不会执行。在 Java 语言中,try 后面可以有多个 catch 代码块,用来捕获不同类型的异常,需要注意的是前面的 catch 捕获异常类型一定不能包含后面的异常类型,这样的话,编译器会报错。
- finally:不论 try-catch 如何执行,finally 一定是最后执行的代码块,所有通常用来处理一些资源的释放,比如关闭数据库连接、关闭打开的系统资源等。
相关笔试面试题:
1、try 可以单独使用吗?
答:**try 不能单独使用,**否则就失去了 try 的意义和价值。
2、以下 try-catch 可以正常运行吗?
try {
int i = 10 / 0;
} catch {
System.out.println("last");
}
3、以下 try-finally 可以正常运行吗?
try {
int i = 10 / 0;
} finally {
System.out.println("last");
}
答:可以正常运行。
4、以下代码 catch 里也发生了异常,程序会怎么执行?
try {
int i = 10 / 0;
System.out.println("try");
} catch (Exception e) {
int j = 2 / 0;
System.out.println("catch");
} finally {
System.out.println("finally");
}
System.out.println("main");
答:程序会打印出 finally 之后抛出异常并终止运行。
5、常见的运行时异常都有哪些?
- java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象;
- java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误,通常是程序试图通过字符串来加载某个类时引发的异常;
- java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符;
- java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生;
- java.lang.ClassCastException 数据类型转换异常;
- java.lang.NoClassDefFoundException 未找到类定义错误;
- java.lang.NoSuchMethodException 方法不存在异常;
- java.lang.IllegalArgumentException 方法传递参数错误。
6、Exception 和 Error 有什么区别?
答:Exception 和 Error 都属于 Throwable 的子类,在 Java 中只有 Throwable 及其之类才能被捕获或抛出,它们的区别如下:
- Exception(异常)是程序正常运行中,可以预期的意外情况,并且可以使用 try/catch 进行捕获处理的。Exception 又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception),运行时异常编译能通过,但如果运行过程中出现这类未处理的异常,程序会终止运行;而受检查的异常,要么用 try/catch 捕获,要么用 throws 字句声明抛出,否则编译不会通过。
- Error(错误)是指突发的非正常情况,通常是不可以恢复的,比如 Java 虚拟机内存溢出,诸如此类的问题叫做 Error。
7、throw 和 throws 的区别是什么?
答:它们的区别如下:
- throw 语句用在方法体内,表示抛出异常由方法体内的语句处理,执行 throw 一定是抛出了某种异常;
- throws 语句用在方法声明的后面,该方法的调用者要对异常进行处理,throws 代表可能会出现某种异常,并不一定会发生这种异常。
8、为什么 finally 总能被执行?
答:finally 总会被执行,都是编译器的作用,因为编译器在编译 Java 代码时,会复制 finally 代码块的内容,然后分别放在 try-catch 代码块所有的正常执行路径及异常执行路径的出口中,这样 finally 才会不管发生什么情况都会执行。