目录
一、异常处理机制
一、try-catch-finally
二、throws
二、try-catch 异常处理使用细节
三、try-catch-finally练习
第一题
第二题
第三题
第四题
一、异常处理机制
共有两种异常处理机制
一、try-catch-finally
处理机制图示
二、throws
关于第二点,如Exception01.java中所示,就算没有用try-catch处理,直接运行,也是会报错的,因为有默认的 throws Exception
package com.hspedu.exception_;/*** @author GQQ* @version 1.0*/
public class Exception01 {public static void main(String[] args) throws Exception{int num1 = 10;int num2 = 0;int res = num1 / num2;System.out.println("程序继续运行....");}
}
二、try-catch 异常处理使用细节
package com.hspedu.exception_;/*** @author GQQ* @version 1.0*/
public class TryCatchDetail {public static void main(String[] args) {//1. 如果异常发生了, 则异常发生后面的代码不会执行, 直接进入到 catch 块//2. 如果异常没有发生, 则顺序执行 try 的代码块, 不会进入到 catch//3. 如果希望不管是否发生异常, 都执行某段代码(比如关闭连接, 释放资源等)则使用如下代码- finallytry {String str = "java学习";//String str = "123";int a = Integer.parseInt(str);System.out.println("数字" + a);//发生异常后,就不会再执行此输出语句} catch (NumberFormatException e) {System.out.println("异常信息=" + e.getMessage());}finally{System.out.println("代码块被执行...");}System.out.println("程序继续...");}
}
package com.hspedu.exception_;/*** @author GQQ* @version 1.0*/
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());//NullPointerExceptionint num1 = 10;int num2 = 0;int res = num1 / num2;//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 {}System.out.println(123);}
}class Person {private String name = "jack";public String getName() {return name;}
}
package com.hspedu.exception_;/*** @author GQQ* @version 1.0*/
public class TryCatchDetail03 {public static void main(String[] args) {try{int n1 = 10;int n2 = 0;System.out.println(n1 / n2);}finally {//没有捕捉异常,其实是用了 throws Exception,还是会执行finally里的语句System.out.println("执行了finally...");}System.out.println("程序继续执行...");//当出现异常的时候此语句不会被执行}
}
三、try-catch-finally练习
第一题
package com.hspedu.exception_;/*** @author GQQ* @version 1.0*/
public class ExceptionExercise01 {public static int method() {try {String[] names = new String[3];//names[1]的默认值为null,把null和tom比较会直接报空指针异常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,然后跳出整个method方法,但是finally里的语句必须被执行//所以这里的3不returnreturn 3;} finally {//最后是return 4,也就是说结果是输出4return 4;}}public static void main(String[] args) {System.out.println(method());//4}}
涉及知识点:
1.String型变量的默认值为null ,当用null进行运算时就会报空指针异常
2.return表示跳出/结束这个方法,但是finally中的语句必须要执行,此时finally的优先级大于return
第二题
package com.hspedu.exception_;/*** @author GQQ* @version 1.0*/
public class ExceptionExercise02 {public static int method() {int i = 1;try {i++;String[] names = new String[3];if (names[1].equals("tom")) {//names[1]的默认值为null,把null和tom比较会直接报空指针异常System.out.println(names[1]);} else {names[3] = "hspedu";}return 1;} catch (ArrayIndexOutOfBoundsException e) {return 2;} catch (NullPointerException e) {//空指针异常后会执行return ++i,然后跳出整个method方法,但是finally里的语句必须被执行//所以这里只是完成 i的自增,并不会returnreturn ++i;} finally {//最后是return 4,也就是说结果是输出4return ++i;}}public static void main(String[] args) {System.out.println(method());//4}
}
知识点:在捕捉到空指针异常的
catch (NullPointerException e) {//空指针异常后会执行return ++i,然后跳出整个method方法,但是finally里的语句必须被执行//所以这里只是完成 i的自增,并不会returnreturn ++i; }
由于finally的存在,此处虽然不会返回,但是++i的运算还是会执行
第三题
package com.hspedu.exception_;/*** @author GQQ* @version 1.0*/
public class ExceptionExercise03 {public static int method() {int i = 1;try {i++;String[] names = new String[3];if (names[1].equals("tom")) {//names[1]的默认值为null,把null和tom比较会直接报空指针异常System.out.println(names[1]);} else {names[3] = "hspedu";}return 1;} catch (ArrayIndexOutOfBoundsException e) {return 2;} catch (NullPointerException e) {//空指针异常后会执行return ++i,然后跳出整个method方法,但是finally里的语句必须被执行//所以这里只是 return 2, 然后2被临时变量temp保存起来 temp = 2//然后完成i++, i = 3return i++;} finally {//++i, i = 4;++i;System.out.println("i=" + i);}}public static void main(String[] args) {System.out.println(method());//2和4}}
第四题
package com.hspedu.exception_;import java.util.Scanner;/*** @author GQQ* @version 1.0*/
public class ExceptionExercise04 {public static void main(String[] args) {while(true){System.out.print("请输入要判断的数字:");Scanner scanner = new Scanner(System.in);try {String str = scanner.next();int num = Integer.parseInt(str);System.out.println("输入的整数为:" + num);break;//如果上述输出语句能够执行,说明没有捕捉到异常,结束循环} catch (NumberFormatException e) {System.out.println("你输入的不是整数,请重新输入");}}}
}