思维导图:

5.2 运行时异常与编译时异常
在Java编程中,异常分为两大类:编译时异常(checked exceptions)和运行时异常(unchecked exceptions)。理解二者的差异对于合理地处理程序中的错误至关重要。
编译时异常(Checked Exceptions)
- 定义:编译时异常是在编译期间会被Java编译器检查的异常。
- 特点:如果代码中可能会抛出编译时异常,但没有捕获或声明抛出,则程序无法编译通过。
- 处理方法:
try-catch
:显式捕获异常并处理。throws
:在方法签名中声明可能抛出的异常,让方法的调用者负责处理。
- 例外:
Exception
的子类中,除了RuntimeException
及其子类之外,其他都属于编译时异常。
运行时异常(Runtime Exceptions)
- 定义:运行时异常是在程序运行期间由Java虚拟机抛出的异常。
- 特点:编译器不会检查这类异常,即使不进行处理,代码也能编译通过,但有可能在运行时出现错误。
- 常见类型:
ArithmeticException
(算术异常)IndexOutOfBoundsException
(索引越界异常)ClassCastException
(类型转换异常)NullPointerException
(空指针异常)NumberFormatException
(数字格式化异常)
- 示例:
int[] arr = new int[5];
System.out.println(arr[6]); // 抛出IndexOutOfBoundsException
笔记要点:
- 区分清楚编译时异常和运行时异常的定义和特性。
- 理解异常处理的两种基本方法:捕获和声明抛出。
- 掌握常见的运行时异常类型及其典型的引发场景。
- 注意运行时异常是由程序逻辑错误导致的,强调在编写阶段就应当尽量避免这些错误。
我的理解:
要理解5.2节“运行时异常与编译时异常”的概念,我们可以从Java异常处理机制的基础谈起:
Java中的异常分为两类:编译时异常(checked exceptions)和运行时异常(unchecked exceptions)。
编译时异常(Checked Exceptions)
编译时异常是那些在编译期间必须被处理的异常。这类异常通常是外部错误,与程序的运行环境有关,比如文件不存在、网络连接失败等。Java编译器要求程序员必须显式地处理这些异常。如果程序中可能抛出编译时异常,但没有被捕获(try-catch)或者没有被声明抛出(throws),那么程序就不能通过编译。
处理编译时异常的两种主要方法是:
try-catch
:在可能发生异常的代码块周围放置try-catch语句,以捕获并处理异常。throws
:在方法的声明中使用throws关键字,表示这个方法可能会抛出异常,而不是立即处理异常,将异常处理的责任交给了调用这个方法的上级代码。
运行时异常(Runtime Exceptions)
运行时异常是那些在程序运行期间可能被抛出的异常。它们是程序内部错误,通常是开发者的逻辑错误,比如数组越界、空指针访问等。这些异常是由Java虚拟机在运行时自动抛出的。与编译时异常不同,编译器不要求程序员显式地处理这些异常,即使没有捕获或声明抛出这些异常的代码,程序仍然可以编译通过。但是,如果运行时异常在运行时发生并且没有被捕获,那么程序将会异常终止。
运行时异常的处理通常侧重于预防,程序员应该在编写代码时尽可能地避免这些异常的发生。
理解这两类异常的区别,有助于开发出更加健壮的Java应用程序。编译时异常使得我们不得不处理可能出现的外部错误,而运行时异常则提醒我们需要编写更加健全的代码逻辑。
总结:
重点
- 异常分类:了解异常分为编译时异常(checked exceptions)和运行时异常(unchecked exceptions)两大类。
- 编译时异常:必须在编写代码时显式进行处理的异常,否则程序无法通过编译。
- 运行时异常:在代码运行时抛出的异常,Java编译器不会检查这些异常。
- 异常处理机制:通过
try...catch
语句捕获异常或使用throws
关键字声明异常,以及finally
块的使用。
难点
- 区分异常类型:理解哪些异常属于编译时异常,哪些属于运行时异常。
- 异常处理策略:学会选择合适的方式来处理不同类型的异常,比如何时捕获异常,何时抛出异常。
- 异常的正确使用:知道什么情况下应该自定义异常以及如何自定义。
易错点
- 混淆两种异常:有时候会混淆编译时异常和运行时异常,例如错误地认为运行时异常也需要在编译期处理。
- 异常处理不当:可能会使用过于宽泛的
catch
来捕获异常,例如catch (Exception e)
,这可能会隐藏其他重要的异常。 - 忽略异常:在编写代码时可能会忽略编译时异常,没有适当的处理或声明抛出。
- 异常丢失:在异常处理时,如果在
finally
块中抛出新的异常或返回值,可能会导致原有异常信息丢失。
要充分理解这一节内容,不仅要记住不同异常的类型和它们的处理方法,还需要通过实践来加深理解。例如,通过编写引发不同类型异常的代码段,并尝试使用不同的方法来处理它们,可以帮助巩固理论知识。