JavaBasic-7-异常
异常处理
Exception类的层次
异常概述
在Java编程中,异常是指在程序执行期间可能发生的错误或意外情况。当发生异常时,它会打断正常的程序流程并且可能导致程序终止。Java提供了异常处理机制,允许开发者在代码中捕获和处理异常,从而提高程序的健壮性和稳定性。
为了有效地处理异常,Java提供了一些关键字和语句,例如try、catch、finally、throw和throws。通过使用这些关键字,开发者可以捕获异常并采取相应的措施来处理异常情况,保证程序的稳定性和可靠性。
- 编译时异常是在编译成class文件时必须要处理的异常,也称为受检异常
- 运行时异常是在运行字节码文件时出现的异常,也称为非受检异常
Exception 和 Error 区别
在Java中,Exception和Error都是Throwable类的子类,但它们在用途和处理方式上有所不同。
Exception:
- Exception类代表程序可以处理的异常情况。它分为两种类型:已检查异常(checked exceptions)和未检查异常(unchecked exceptions)。
- 已检查异常(Checked Exception)在编译时强制进行检查,必须通过try-catch块或者throws语句进行处理。
- 未检查异常(Unchecked Exception)指的是运行时异常,不需要在代码中显式地进行处理。常见的未检查异常包括NullPointerException和ArrayIndexOutOfBoundsException等。
Error:
- Error类代表程序无法处理的错误,通常是虚拟机运行时的错误。它们表示的是严重的问题,大多数情况下程序无法恢复。
- Error不应该被程序捕获和处理,因为捕获Error可能会导致程序状态不稳定甚至崩溃。
- 常见的错误包括OutOfMemoryError和StackOverflowError等。
因此,主要区别在于程序可以处理的异常应该使用Exception类,而程序无法处理且可能导致程序崩溃的严重问题应该使用Error类。通常情况下,开发人员应该捕获并处理异常,但不应该捕获并处理错误。
虚拟机默认处理异常方式
- 在产生异常的代码处生成一个异常对象,接着查看是否有处理异常的代码,如果没有就交给调用者处理,如果调用者也不处理则最终交给虚拟机
- 虚拟机将异常的名称,异常原因以及异常出现的位置等信息输出在控制台
- 程序停止运行
使用
throws
处理异常
- 格式:
throws 异常类名
- 注意:写在方法的定义处,表示显式声明一个异常
- 这种异常异常处理方式主要用于编译时异常,如果声明的异常是运行时异常则声明处的代码可以省略
- throws声明一个异常表示当前方法内不处理这个异常,而是交给调用者处理,如果调用者也不处理则最终交给虚拟机采用默认的处理方式
使用
throw
抛出异常对象
- 格式:
throw new 异常类名();
- 注意:写在方法内部,表示在当前的代码处手动抛出一个异常,下面的代码不用再执行
- 给方法的调用者抛出了一个异常
使用
try...catch
处理异常
1 | try{ |
- 作用是可以让程序继续执行下去
- 如果try块中没有出现异常,则程序会将try块的代码执行完毕,然后跳过catch块的代码继续执行下去
- 如果try块中某行代码出现异常,则该行后面的代码不再执行转而去执行catch块中的代码,然后继续执行下去
- 如果try块中出现的异常没有被捕获,则直接在出现异常的代码处停止执行,将异常交给虚拟机处理,程序不再执行下去
- 如果try块中出现多个异常,那么只需要添加多个catch块处理,如果多个异常存在继承关系,那么父类catch块需要写在最下方,发生异常时只会匹配一个catch块
- 写多个catch块的好处是可以针对不同的异常有不同的处理方式
Throwable成员方法
Throwable 是所有异常类的父类,所以所有异常对象都能使用该类的方法
方法名 | 说明 |
---|---|
public String getMessage() | 返回详细消息字符串 |
public String toString() | 返回简短描述字符串 |
public void printStackTrace() | 将异常信息打印输出在控制台 |
自定义异常
- 所有异常都必须是 Throwable 的子类
- 如果希望写一个检查性异常类,则需要继承 Exception 类
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类
1 | class MyException extends Exception{ |
throws 和 throw 对比
作用 | 位置 | 后接对象 | |
---|---|---|---|
throws | 异常处理方式 | 方法声明处 | 异常类型 |
throw | 生成异常对象的关键字 | 方法体中 | 异常对象 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment