什么是异常
异常就像是生活中遇到的意外情况。在程序运行过程中,可能会出现一些意想不到的问题,比如要打开的文件不存在、网络连接突然中断、除数为零等,这些就是异常。当异常发生时,如果不处理,程序可能会崩溃或出现错误结果,所以需要我们去处理这些异常,让程序能更稳健地运行。
假设我们要写一个程序,从键盘读取一个整数,然后计算 10 除以这个整数的结果。
import java.util.Scanner;public class ExceptionExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入一个整数:");int num = scanner.nextInt();int result = 10 / num;System.out.println("10 除以 " + num + " 的结果是:" + result);}
}
如果用户输入 0,就会出现除数为零的异常(ArithmeticException
),程序会中断并报错。
为了处理这个异常,我们可以这样修改代码:
import java.util.Scanner;public class ExceptionExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {System.out.print("请输入一个整数:");int num = scanner.nextInt();int result = 10 / num;System.out.println("10 除以 " + num + " 的结果是:" + result);} catch (ArithmeticException e) {System.out.println("输入的数不能为 0 哦,出现了异常:" + e.getMessage());}}
}
这里使用了try-catch
结构来处理异常。try
块里放可能会出现异常的代码,catch
块用来捕获并处理特定类型的异常(这里是ArithmeticException
)。当用户输入 0 时,程序不会崩溃,而是会输出我们在catch
块里设置的提示信息:“输入的数不能为 0 哦,出现了异常:/by zero”。
除了这种基本的异常处理,还有finally
块(无论是否发生异常,都会执行)、多个catch
块处理不同类型的异常、自定义异常等更复杂的用法,目的都是为了让程序在遇到意外情况时能更友好地处理,而不是直接崩溃。
三种类型的异常:
- 检查性异常:这些异常是程序在编译时编译器会检查的异常。它们通常表示程序在正常运行时可能会遇到的外部错误,但程序本身无法控制,不过可以提前做好处理。这类异常通常是因为外部资源不可用或用户输入错误等引起的。如果不处理这些异常,程序将无法编译通过。
- 运行时异常:运行时异常是在程序运行过程中可能发生的异常,但不需要在编译时进行强制处理。它们通常是由程序逻辑错误导致的,比如数组越界、空指针引用、除数为零等。这些异常通常是因为代码编写不当,应该在编写代码时尽量避免。
- 错误:错误表示程序在运行时发生的严重问题,通常是超出了程序的控制范围,比如虚拟机错误、内存不足、栈溢出等。一般情况下,程序不应该去捕获或处理这些错误,因为它们通常是无法恢复的。
异常体系结构
Java
把异常当作对象来处理,并定义一个基类 java.lang.Throwable
作为所有异常的超类。
在 Java API
中已经定义了许多异常类型,这些异常类分为两大类,错误 Error
和异常 Exception
。