一:异常处理方式
- try-catch-finally :程序员在代码中捕获发生的异常自行处理
- throws 将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM
1:try-catch-finally 处理机制示意图
```java try { //捕获到异常 //1:当一场发生时 //2:系统将异常封装成Exception对象e // 传递给catch //3:得到异常对象后,自己处理 //4:注意,如果乜有发生异常 //catch代码块不执行 } catch (Exception e) {
}finally { //1:不管try代码块是否发生异常,始终要执行finally //2:所以,通常将释放资源的代码,放在finally }
<a name="eYwdC"></a>
#### 2:throw示意图
![image.png](https://cdn.nlark.com/yuque/0/2022/png/2595924/1661175599978-e35244cb-eaea-4c07-959e-191c444f1599.png#clientId=uea31069d-700c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=357&id=u1e1356b3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=357&originWidth=640&originalType=binary&ratio=1&rotation=0&showTitle=false&size=182146&status=done&style=none&taskId=u0590c336-a994-4f1e-8a95-934bc487477&title=&width=640)
:::info
**_如果一直throw到JVM,JVM对于异常的处理就是 :输出异常信息,退出程序_**
:::
```java
public class Test {
public static void main(String[] args) throws Exception {
int num1 = 10;
int num2 = 0;
//如果这个异常这个异常没有进行任何处理
//会有一个默认的throw
//这也就证明了我们如果没有进行任何处理
//程序就打印异常信息,然后退出程序
int res = num1 / num2;
}
}
二:try-catch方式处理异常说明
- 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块
- 如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch
- 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等),则加上finally
```java
public class Test1 {
public static void main(String[] args) {
} }try {
String name = "Sakura";
int num = Integer.parseInt(name);
System.out.println("转换后的数字为:"+ num);
} catch (NumberFormatException e) {
System.out.println("捕获的异常为:"+ e.getMessage());
}finally {
System.out.println("finally代码块被执行");
}
System.out.println("程序继续执行....");
1. **_如果 try 代码块有可能有多个异常_**
2. **_可以使用多个 catch 分别捕获不同的异常,相应处理_**
3. **_要求子类异常写在前面,父类异常写在后面_**
```java
public class Test2 {
public static void main(String[] args) {
try {
Person person = new Person();
person = null;
System.out.println(person.getName());
int A = 10;
int B = 0;
int num = A/B;
}catch (NullPointerException e) {
System.out.println("空指针异常:"+ e.getMessage());
}catch (ArithmeticException e){
System.out.println("算数异常"+e.getMessage());
}catch (Exception e){
}
}
}
class Person{
String name = "sakura";
public String getName() {
return name;
}
}
可以进行try-finally 配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
public class Test2 {
public static void main(String[] args) {
try {
int A = 10;
int B = 0;
int num = A/B;
}finally {
System.out.println("出现异常,备份数据....");
}
}
}
三:异常处理课堂练习
1:分析输出结果
public class Test3 {
public static int method() {
int i = 1;
try {
i++;
String[] names = new String[3];
if (names[1].equals("tom")) { //空指针异常
System.out.println(names[1]);
} else {
names[3] = "hspedu";
}
return 1;
} catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return ++i;
} finally {
return ++i;
}
}
public static void main(String[] args) {
System.out.println(method()); //4
}
}
public class Test3 {
public static int method() {
try {
String[] names = new String[3];
if (names[1].equals("tom")) { //空指针异常
System.out.println(names[1]);
} else {
names[3] = "hspedu";
}
return 1;
} catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return 3;
} finally {
return 4;
}
}
public static void main(String[] args) {
System.out.println(method()); //4
}
}
public class Test3 {
public static int method() {
int i = 1;
try {
i++;
String[] names = new String[3];
if (names[1].equals("tom")) { //空指针异常
System.out.println(names[1]);
} else {
names[3] = "hspedu";
}
return 1;
} catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return ++i; //底层有一个temp临时变量保存3
//执行玩finally之后再执行return 3
} finally {
++i; //i=4
System.out.println("i = " + i); //4
}
}
public static void main(String[] args) {
System.out.println(method()); //4 ,3
}
}
2:
如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
public class Test4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = 0;
while (true){
System.out.println("请输入一个整数:");
try {
num = Integer.parseInt(scanner.next());
break;
} catch (NumberFormatException e) {
System.out.println("你输入的不是整数,请重新输入");
}
}
System.out.println("输入的整数为:"+ num);
}
}
四:try - catch - finally执行顺序小结
如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句
- 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句!