优雅的代码离不开优雅的异常处理。 ————小欢子
正如引言,一个好的异常处理,可以极大提升代码的可读性和可维护性。因此十分有必要将Java的异常处理摸清吃透。
Java的异常处理机制都来源一个父类Throwable,Throwable下有两个重要的子类,分别是Error和Exception,也就是我们常说的错误和异常,众所周知,Error是处理不了的,一旦出现程序就会终止(这里让我再研究研究,因为不确定是程序终止还是线程终止)。而Exception则是可以被catch处理,之后程序依旧会正常运行。
Error
Error出现后我们是无法处理的,因此我们要尽量避免Error的出现。常见的Error有内存溢出OutOfMemoryError(OOM),StackOverFlow(SOF)栈溢出等。
Exception
Error出现后我们无法处理,因此我们只能尽量避免Error的出现。但是Exception则相反,Exception是可以被捕获的,捕获之后我们可以做处理,然后继续执行后续代码,而且有时的Exception是我们有意而为之(可以帮助我们更好的掌控代码和避免风险)。Exception一般分为Checked Exception和Unchecked Exception。
- Checked exception:顾名思义,受检查的异常。若有该类异常,程序在编译时就会报错,如IO异常
- Unchecked exception:不受检查的异常,可正常编译,只有在运行时才能被发现。该类异常有一个很重要的类,RuntimeException,其下有众多“耳熟能详”的异常,如空指针异常,索引越界异常
Exception的捕获
我们通常是使用try。。。catch来进行Exception的捕获与处理。
实验1
public static void main(String[] args) {
int[] arr = new int[10];
try {
arr[10] = 0;
} catch (Exception e) {
System.out.println("抓到你啦: " + e.toString());
}
System.out.println("继续执行");
System.out.println("hello world");
}
实验1运行结果
抓到你啦: java.lang.ArrayIndexOutOfBoundsException: 10
继续执行
hello world
通过实验1的运行结果我们可以得出,Exception是可以被捕获的,捕获之后可以进行相应的逻辑处理,而且不影响后续代码的执行。
自定义Exception
自定义的Exception更有利于我们把控代码,可以根据我们自己的逻辑需求来自定义(妈妈再也不担心我的代码是屎山了)。我就写个小小的Demo吧。
自定义Exception:
public class MyException extends RuntimeException {
}
实验2
public static void main(String[] args) {
try {
sayHello();
}catch (Exception e){
System.out.println("捕获到了:"+e.toString());
System.out.println("但我不处理");
}
System.out.println("就是玩");
}
public static void sayHello(){
throw new MyException();
}
实验2的运行结果
捕获到了:MyException
但我不处理
就是玩