目录
- 1- 什么是异常概述(What、Why)
- 2- ⭐异常体系结构图-总览
- 3- 五大运行时异常
- 4- 编译异常
- 5- 异常处理机制
- 6- 自定义异常
- 小结
-
- 1- 什么是异常?Java 中的异常是如何分类的?
- 2- 常见的 Exception 有哪些?
- 3- throw 和 throws 有什么区别?
- 4- Error 和 Exception 有什么区别?
- 5- try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
- 6- finally 一定会被执行吗?
- 7- 什么是受检异常(Checked Exception)和非受检异常(Unchecked Exception)?
- 8- 解释 try-catch-finally 语句的工作原理。
- 9- 三道异常处理经典题目,如果 try 中带有 return,finally 怎么执行?
1- 什么是异常概述(What、Why)
1-1 什么是异常(What)
基本概念
- 在 Java 语言中,将程序执行中发生的不正常的情况称为 “异常”。(开发过程中的语法错误和逻辑错误不是异常)
执行过程中的异常可以分为两类
- Error(错误):Java 虚拟机无法解决的严重问题。比如 JVM 系统内部错误、资源耗尽等情况。比如:StackOverflowError(栈溢出)和 OOM(out of memory),Error 是严重的错误,程序会崩溃。
- Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等。
- Exception分为两大类:运行时异常(程序运行时,发生的异常)和 编译时异常(编译时,编译器检查出来的异常)。
通过一个例子,引出异常
public class Exception1 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
// 执行到这部分的时候,程序会不出现(抛出异常) ArithmeticException
// 当抛出异常之后,程序就退出崩溃了,下面的代码就不再执行
int res = num1/num2;
System.out.println("程序继续运行...");
}
}
- 针对上述问题,执行到
int res = num1/num2;
代码的时候,会出现异常。 - 问题在于出现了一个不算致命的问题,但会导致整个系统崩溃。因此 Java 设计者提供了 异常处理机制来解决这个问题。
1-2 为什么要有异常处理机制(Why)
- 如果程序员任务一段代码可能出现异常/问题,可以使用 try-catch 异常处理机制来解决。从而保证代码的健壮性。如果进行了异常处理,即使出现了异常,程序可以继续执行。
- 常见的异常处理机制如下:
public class Exception1 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
try{
int res = num1/num2;
}catch (Exception e){
// e.printStackTrace();
System.out.println(e.getMessage()); // 输出异常信息
}
System.out.println("程序继续运行...");
}
}
2- ⭐异常体系结构图-总览
2-1 分类
- 下图的内容需要记忆
- 编译异常(Checked 受检异常):是在 Java源程序 经过
javac.exe
转为字节码文件阶段遇到的异常。 - 运行异常(Unchecked 非受检异常):是在字节码文件在内存中加载、运行时类的时候出现的异常。
2-2 异常体系结构小结
异常分为两大类,运行时异常和编译时异常:
- 运行时异常(Unchecked 非受检异常):编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。
- 举例:(比如除法操作,
nums1 = 10
、nums2 = 0
则nums1/nums2
可得到运行时异常)
- 举例:(比如除法操作,
- 编译时异常(Checked 受检异常):是在 Java源程序 经过
javac.exe
转为字节码文件阶段遇到的异常。
// 编译时异常举例
public class Exception02 {
public static void main(String[] args) {
// Throwable
FileInputStream fis;
try {
fis = new FileInputStream("d:\\aa.jpg");
int len;
while ((len = fis.read()) != -1) {
System.out.println(len);
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 在上述代码中,
FileInputStream
会报编译时异常,也就是 IDEA 工具会报错,必须立即处理的异常。
3- 五大运行时异常
常见的运行时异常包括
- ①
NullPointerException
:空指针异常 - ②
ArithmeticException
:数学运算异常 - ③
ArrayIndexOutOfBoundsException
:数组下标越界异常 - ④
ClassCastException
:类型转换异常 - ⑤
NumberFormatException
:数字格式不正确异常
3-1 NullPointerException 空指针异常
NullPointerException
空指针异常
- 当应用程序试图在需要对象的地方使用 null 时,抛出该异常,看案例演示。
public class NullPointerException_ {
public static void main(String[] args) {
String name = null;
// 在输出的时候会报空指针异常
System.out.println(name.length());
}
}
3-2 ArithmeticException 算数异常
- 比如出现 除以 0 的操作的时候就会出现算数异常
public class Exception1