异常处理关键字

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 类。
//代码栗子🌰
//声明自定义MyEx异常,继承Exception类
class MyEx extends Exception {}

public class ExTestDrive {
public static void main(String[] args) {
String test = args[0];
try {
System.out.print("t");
//因为doRisky可能抛出MyEx异常,所以要放到try块中
doRisky(test);
System.out.print("o");
} catch (MyEx e) { //捕获异常
System.out.print("a");
} finally { //无论是否出现异常,都会执行的finally块
System.out.print("w");
}
System.out.println("s");
}

//doRisky方法可能会抛出MyEx异常
static void doRisky(String t) throws MyEx {
System.out.print("h");

//如果传入参数参数为yes,抛出异常MyEx
if ("yes".equals(t)) {
throw new MyEx();
}
System.out.print("r");
}
}

执行代码结果如下

$ java ExTestDrive yes				#传入参数为yes,抛出异常,触发异常处理,分别打印出 t h a w s
thaws

$ java ExTestDrive no #传入参数为no,正常执行,不触发异常处理,分别打印出 t h r o w s
throws

###Notes

  • Java程序中的异常是在异常程序运行的过程中被异常处理模块所捕获的,在编译过程中的异常并不能通过异常处理来解决。
  • catch/finally块必须和try块一同出现,不能单独出现
  • try块必须拥有catch/finally两者其一,或者全部
  • try/catch/finally块之间不能存在任何代码
  • 一个try块可以配合多个catch一同出现
  • try-catch块最终只能拥有一个fianlly块
  • printStackTrace()是Exception类中的方法,经常用来程序调试
  • 如果在同一个catch块中捕获多个异常用 “ | “分隔开,如catch(FileNotFountException | IOException)