一:异常处理方式
- 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示意图:::info**_如果一直throw到JVM,JVM对于异常的处理就是 :输出异常信息,退出程序_**:::```javapublic 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. **_要求子类异常写在前面,父类异常写在后面_**```javapublic 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=4System.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里面的语句!
