异常处理基本介绍
异常处理就是当异常发生时,对异常处理的方式。
- 异常处理的方式
try - catch - finally
程序员在代码中捕获发生的异常,自行处理
throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM
- 示意图
通常将释放资源的代码,放在finally
简单来说,throws更像是“甩锅”关键字
当走到JVM还没有解决异常时,JVM的处理方式是:1.输出异常信息 2.退出程序
一般main方法都会有一个默认的throws Exception语句,抛给JVM
try-catch异常处理
- Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个数量的try…catch块。
- 基本语法
try{
//可疑代码
//将异常生成对应的异常对象,传递给catch块
}catch(异常){
//对异常的处理
}
try-catch方式处理异常-注意事项 [TryCatchDetail.java]
- 如果异常发生了,则异常后面的代码不会执行,直接进入到catch块。
- 如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
- 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码 - finally{ }
演示:
package com.tao.try_;
/**
* Create By 刘鸿涛
* 2021/12/31 18:04
*/
public class TryCatchDetail {
public static void main(String[] args) {
try {
//ctrl + alt + t
String str = "涛涛";
int a = Integer.parseInt(str);
System.out.println("数字:" + a);
} catch (NumberFormatException e) {
System.out.println("异常信息 = " + e.getMessage());
}finally {
System.out.println("finally执行了"); //总会执行
}
}
}
异常信息 = For input string “涛涛”
finally执行了
- 可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException 在前),如果发生异常,只会匹配一个catch,案例演示
package com.tao.exception_;
/**
* Create By 刘鸿涛
* 2021/12/31 18:14
*/
public class TryCatchDetail02 {
public static void main(String[] args) {
//解读:
//1.如果try代码块可能有多个异常
//2.可以使用多个catch 分别捕获不同的异常,相应处理
//3.要求子类异常写在前面,父类异常写在后面
try {
Person person = new Person();
//person = null;
System.out.println(person.getName()); //NullPointerException
int 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) {
System.out.println(e.getMessage());
} finally {
}
}
}
class Person{
private String name;
public String getName(){
return name;
}
}
-
可以进行 try - finally 配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
try{ //代码... }finally{ //总是执行 }