Java Exception Handling
异常处理关键字
throw
抛出异常必须有的关键字。在Java处理异常的过程中,如果出现异常的话,程序会创建出一个异常的对象,再由异常处理程序来处理异常。throw关键字被用来抛出异常在运行时处理
throws
当某个方法抛出异常的时候,我们需要在声明方法的后面加上throws关键字。让主调方法知道被调用的方法可能会抛出这些异常,并在调用方法中处理该异常,或者将异常抛出给主调函数的调用函数(此处禁止套娃)。throws可以抛出多个异常。
try-catch
try块中存放可能存在异常的程序,而catch块会捕获由try块中所抛出的异常,一个try块可以对应多个catch块。try-catch块也可以嵌套使用。
finally
不论异常是否发生,finally块的代码都会被执行。
多层异常
Java中的异常类是分层的。Throwable类是Error类和Exception类的父类,Exception类又分为Checked Exceptions和Checked Exception。
Error
Error的异常出现,往往都是一些非预期的问题。比如硬件损坏,内存不足等。这些情况并不是我们在开发过程中所能预料并且处理的。在Java中,错误通过Error的子类来表述。
Checked Exception
检查异常,即Java编译器要求开发人员在开发的过程中必须要处理的异常。在程序出现异常的时候,程序可以通过异常捕获程序,从异常中恢复。比如FileNotFoundException异常。如果在编写过程中不进行异常捕获,代码无法通过编译。Exception类是所有Checked Exception的父类。
Unchecked Exception
也称为RuntimException,比如NullPointerException,IndexOutOfException等,这类异常,Java编译器不强制要求对异常进行处理和捕获。即使不处理也可以编译成功。
自定义异常
Java提供了许多异常类供我们使用,但有时我们可能需要创建自己的自定义异常类,以更加具体的消息来通知主调函数有关特定类型的异常的信息。
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
//代码栗子🌰 |
执行代码结果如下
$ java ExTestDrive yes #传入参数为yes,抛出异常,触发异常处理,分别打印出 t h a w s |
###Notes
- Java程序中的异常是在异常程序运行的过程中被异常处理模块所捕获的,在编译过程中的异常并不能通过异常处理来解决。
- catch/finally块必须和try块一同出现,不能单独出现
- try块必须拥有catch/finally两者其一,或者全部
- try/catch/finally块之间不能存在任何代码
- 一个try块可以配合多个catch一同出现
- try-catch块最终只能拥有一个fianlly块
- printStackTrace()是Exception类中的方法,经常用来程序调试
- 如果在同一个catch块中捕获多个异常用 “ | “分隔开,如catch(FileNotFountException | IOException)