1.什么是异常?
- 所谓异常 (exception)是在程序开发过程中,由于开发人员的疏忽或是其他情况都可能导致在程序运行过程中产生的使程序终止正常运行的错误对象。
- 程序一旦发生异常就无法正常有效地执行,不能得到预期的结果。
- 如:数组下标越界、整数除法中零作除数、文件找不到等都可能使程序终止运行。
2.异常类型
- 异常类的体系结构:Java异常类都是Throwable类的子类,它是Object类的直接子类,定义在java.lang包中。
- Error:是Throwanble的一个子类,表示的是错误,错误指的是仅靠程序本身是没有办法恢复的问题,所有程序的内部错误都是Error类及其子类拋出的。
- 例如:VirtualMachine Error(虛拟机损坏或资源耗尽)、内存溢出、栈溢出等,通常比较严重,是不可查的,Java也不会对这些错误进行处理。
- Exception:是Throwable的另外一个子类,表示的是可以被程序捕捉并处理的错误情况,我们称之为异常。Exception又派生出了许多子类来处理不同类型的异常。
- RuntimeException:是Exception的子类,表示运行时异常,用来捕捉程序在运行期间出现的异常现象;当Runtime Exce ption出现时,就表示是开发人员在设计时出现了错误。
- 检查异常 (checked exception):也称为必检异常。对这类异常,程序必须捕获或声明拋出,否则编译不能通过。
3.异常处理:用try-catch捕获异常
try/catch 语句:捕获和处理异常对象 try/catch 语句有try 语句块和 catch 语句
每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常 catch捕获的异常类型是子类异常在前,父类异常在后 捕获多个异常
4.finally语句块
finally 语句块紧接着 try-catch 结构中的最后一个catch 语句块
finally语句为异常处理提供统一的出口,无论try程序块中是否抛出异常等,finally都要执行。 在finally语句中通常进行资源的释放工作,如关闭打开的文件、删除临时文件等。
finally语句块的3种执行情况:
- 没有抛出异常情况:执行 try语句块后,再执行 finally语句块。
- 抛出 catch 语句块中的一个异常情况:执行 try语句块中直到异常情况被抛出为止的所有代码,跳过 try语句块中剩余的代码;执行匹配的 catch语句块中的代码和 finally语句块中的代码。
- 抛出在 catch 语句块中没有捕获到的异常情况:执行 try语句块中直到异常情况被抛出为止的所有代码,跳过 try语向块中剩余的代码;执行 finally语向块中的代码,并把异常情况抛回到方法的调用者。
try-catch-finally 语句可以嵌套 finally 语句块可以和 break、continue 、return 等流程控制语句一起使用。 当try 语句块中出现了上述语句时,程序必须先执行finally语句块,才能最终离开 try 语句块。
finally是最终执行的代码块,无论try...catch块中是否发生异常,finally语句块中的代码都会被执行。
5.throws关键字
任何代码都有发生异常的可能性,如果方法不想对可能出现的异常做捕获处理,那么方法必须声明它可以拋出的这些异常,用于告知方法调用者此方法存在异常。
Java语言通过throws子句声明方法可拋出的异常,throws子句由throws关键字和要抛出的异常类两部分组成,如果需要抛出多个异常类则异常类与异常类之间通过逗号隔开。 •其语法格式如下:
使用throws关键字需要注意以下3点
1.throws关键字只能用于方法的声明中,不能用于方法体内部。 2.方法声明中的throws语句是方法签名的一部分,表示该方法有可能抛出的异常类型。调用该方法时,必须对throws声明的异常进行处理,要么使用try-catch语句块捕获并处理异常,要么继续将异常向上一级调用栈传递。 3.如果方法声明中使用了throws关键字,但方法内部实际上没有抛出异常,那么调用该方法时也不需要进行异常处理。
6.throw关键字
在Java中,throw 语句用于手动抛出异常。使用 throw 语句可以中断当前代码的执行,并将指定的异常对象抛出到调用者,throw 语句的语法如下。 throw 异常对象;
#### 使用 throw 语句需要注意以下4点
1.异常对象必须是Throwable类的子类的实例。可以使用已有的异常类,如Exception、RuntimeException等,也可以自定义异常类。 2.throw 语句必须出现在方法体内,不能用于构造方法或静态初始化块中。 3.throw 语句后面的代码不会被执行,因此如果在throw语句之后还有其他代码,它们将不会被执行。 4.throw 语句通常用于在检测到某种异常情况时,无法继续正常执行代码时使用。例如,当输入参数非法、资源不可用、网络连接断开等情况下,可以使用throw语句抛出相应的异常。
7.throw 和 throws 关键字有什么区别?
throw 和 throws 关键字都与异常处理有关,但用法和目的不同。
throw 关键字用于手动抛出异常,通常用于在代码中检测到错误或异常情况时中断当前代码的执行,并将异常对象抛出给调用者。
throws 关键字用于在方法声明中声明该方法可能抛出的异常,以便调用者知道需要对异常进行处理。