异常 Exception 02
- 六、异常处理
- 1、基本介绍
- 2、异常处理的方式
- 3、示意图
- 4、try-catch
六、异常处理
1、基本介绍
异常处理就是当异常发生时,对异常处理的方式。
2、异常处理的方式
- try-catch-finally
程序员在代码中捕获发生的异常,自行处理 - throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是 JVM
3、示意图
(1) try-catch-finally 处理机制
try {代码/可能有异常} catch(Exception e) {捕获到异常1、当异常发生时2、系统将异常封装成 Exception 对象e,传递给catch3、得到异常对象后,程序员自己处理4、注意,如果没有发生异常,catch代码块不执行} finally {1、不管try代码块是否有异常发生,都要执行finally2、所以,通常将释放资源的代码放在finally}
(2)throws 处理机制图
JVM 调用main方法,main调用 f1,f1 中 调用 f2,f2 抛出(发生)异常。
f2 抛出异常可以使用 ① try-catch-finally ② throws 机制,扔出去,f2 说它不管,抛给 f1(因为是 f1 调用它的),
f1也有两种选择,它也可以继续丢出去 throws。
扔给JVM,处理异常非常暴力,直接①输出异常信息 ②退出程序。
(1)try-catch-finally 和 throws 二选一
(2)如果程序员,没有显式处理异常,默认throws
4、try-catch
- Java提供 try 和 catch 块来处理异常。try 块用于包含可能出错的代码。catch 块用于处理 try 块中发生的异常。可以根据需要在程序中有多个 try…catch 块。finally 可写可不写。
- 基本语法
try {可疑代码将异常生成对应的异常对象,传递给catch块
} catch(异常){对异常的处理
}
没有finally也是可以滴
- IDEA中的快捷键
CTRL + ALT + T
- 【重要】注意事项
① 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块。【案例A】
② 如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
③ 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等) 则使用如下代码 - finally {}。
④ 可以有多个catch语句,捕获不同的异常(进行不同的业务处理,要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException 在前),如果发生异常,只会匹配一个catch。【案例B】
⑤ 可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接退出/崩掉。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。
【举例A】
public static void main(String[] args) {try {String str = "XXXXXXX";System.out.println("=========");int a = Integer.parseInt(str);System.out.println("+++++++++");System.out.println("数字:" + a);} catch (NumberFormatException e) {e.printStackTrace();}
}
int a = Integer.parseInt(str);这句话会报错,直接跳到 catch块
【举例B】
public class TryCatchDetail02 {public static void main(String[] args) {try {Person person = new Person();person = null;System.out.println(person.getName());//NullPointerExceptionint n1 = 10;int n2 = 0;int res = n1/n2;//ArithmeticException} catch (NullPointerException e) {System.out.println("空指针异常=" + e.getMessage());} catch (ArithmeticException e) {System.out.println("算数异常=" + e.getMessage());} catch (Exception e) {//Exception是 NullPointerException 和ArithmeticException的父类System.out.println(e.getMessage());} finally {}}
}class Person {private String name = "jack";public String getName() {return name;}
}