异常
1.异常处理
1.1 try -catch
try 尝试 表示将可能出现异常的代码 存放在try中 try不能单独出现 必须结合catch 或者 finally catch 捕获 表示捕获对应的异常 在catch代码块中处理
情况1: 捕获的是InputMismatchException 出现的也是InputMismatchException 可以捕获到异常 不会中断程序
public class Test2 {public static void main(String[] args) {try {Scanner in = new Scanner(System.in);System.out.print("请输入被除数:");int num1 = in.nextInt();System.out.print("请输入除数:");int num2 = in.nextInt();System.out.println(num1+"/"+ num2 +"="+ num1/ num2);}catch(InputMismatchException e) {e.printStackTrace();// System.err.println("异常捕获到了,出现了输入不匹配异常");}System.out.println("感谢使用本程序!");}}
情况2:出现的异常和捕获的异常不同 依然会中断程序
public class Test3 {public static void main(String[] args) {try {Scanner in = new Scanner(System.in);System.out.print("请输入被除数:");int num1 = in.nextInt();System.out.print("请输入除数:");int num2 = in.nextInt();System.out.println(num1+"/"+ num2 +"="+ num1/ num2);}catch(InputMismatchException e) {e.printStackTrace();// System.err.println("异常捕获到了,出现了输入不匹配异常");}System.out.println("感谢使用本程序!");}}
情况3:如果一段代码中有可能出现多个异常 我们可以使用多个catch块处理
public class Test4 {public static void main(String[] args) {try {Scanner in = new Scanner(System.in);System.out.print("请输入被除数:");int num1 = in.nextInt();System.out.print("请输入除数:");int num2 = in.nextInt();System.out.println(num1+"/"+ num2 +"="+ num1/ num2);}catch(InputMismatchException e) {e.printStackTrace();// System.err.println("异常捕获到了,出现了输入不匹配异常");}catch(ArithmeticException e) {e.printStackTrace();System.err.println(e.getMessage());}System.out.println("感谢使用本程序!");}}
情况4: 我们可以统一写一个异常父类 来处理所有的异常 异常catch块书写顺序 先子类 后父类
public class Test5 {public static void main(String[] args) {try {Scanner in = new Scanner(System.in);System.out.print("请输入被除数:");int num1 = in.nextInt();System.out.print("请输入除数:");int num2 = in.nextInt();System.out.println(num1+"/"+ num2 +"="+ num1/ num2);}catch(InputMismatchException e) {e.printStackTrace();}catch(ArithmeticException e) {e.printStackTrace();}catch(Exception e) {e.printStackTrace();}System.out.println("感谢使用本程序!");}}
1.2 finally
finally 表示最终的意思 表示最终不管 是否出现异常 以及异常是否被捕获到 都将执行的代码 finally不能单独出现 必须结合try 或者 try -catch
public class Test1 {public static void main(String[] args) {try {Scanner in = new Scanner(System.in);System.out.print("请输入被除数:");int num1 = in.nextInt();System.out.print("请输入除数:");int num2 = in.nextInt();System.out.println(num1+"/"+ num2 +"="+ num1/ num2);}catch(InputMismatchException e) {e.printStackTrace();}finally {System.out.println("感谢使用本程序!");}}}
finally不执行的唯一情况 :在finally执行之前退出JVM虚拟机 System.exit(int status); 状态码 0表示 正常退出 非0表示非正常退出 目前写哪个数值都可以退出 没有任何区别
public class Test2 {public static void main(String[] args) {try {Scanner in = new Scanner(System.in);System.out.print("请输入被除数:");int num1 = in.nextInt();System.out.print("请输入除数:");int num2 = in.nextInt();System.out.println(num1+"/"+ num2 +"="+ num1/ num2);System.exit(1);}catch(InputMismatchException e) {e.printStackTrace();}finally {System.out.println("感谢使用本程序!");}}}
finally结合try使用
package com.qfedu.test2;import java.util.Scanner;/*** finally结合try使用* @author WHD**/public class Test3 {public static void main(String[] args) {try {Scanner in = new Scanner(System.in);System.out.print("请输入被除数:");int num1 = in.nextInt();System.out.print("请输入除数:");int num2 = in.nextInt();System.out.println(num1+"/"+ num2 +"="+ num1/ num2);}finally {System.out.println("感谢使用,程序结束");}}}
以下代码 在finally中对返回值的操作 不会影响返回值 实际开发中 不推荐在finally中对返回值做操作 执行顺序:先执行try中return 再执行finally 最后再次执行finally中的return 还使用最初确定的返回值
package com.qfedu.test3;/*** 以下代码 在finally中对返回值的操作 不会影响返回值* 实际开发中 不推荐在finally中对返回值做操作** 执行顺序:先执行try中return 再执行finally 最后再次执行finally中的return* 还使用最初确定的返回值* @author WHD**/public class Test1 {public static void main(String[] args) {System.out.println(m1());}public static int m1() {int num = 10;try {num ++;return num;} catch (Exception e) {e.printStackTrace();}finally {num ++;}return num;}}
1.3 throw和throws
throw表示抛出异常 抛出的异常分为两大类: 1.检查异常CheckedException 调用者必须处理 要么try-catch 要么继续往后声明 2.运行时异常RuntimeException 调用者不是必须处理 throws表示声明异常
package com.qfedu.test4;import java.io.FileNotFoundException;/*** throw throws* 生成并抛出异常 声明方法内抛出了异常位于方法体内部,可作为单独语句使用 必须跟在方法参数列表后面,不能单独使用抛出一个异常对象,且只能是一个 声明抛出异常类型,可以跟多个异常(逗号分隔)* @author WHD**/public class Test2 {public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException {m1(10);m2(10);}public static void m1(int num){if(num % 3 == 1) {throw new ClassCastException("类转换异常");// System.out.println(); 不可达代码}else {throw new ArithmeticException("算数运算异常");}}public static void m2(int num) throws ClassNotFoundException, FileNotFoundException {if(num % 3 == 1) {throw new ClassNotFoundException("类没有找到");}else {throw new FileNotFoundException("文件没有找到");}}}
2. 自定义异常
当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类
使用自定义异常的步骤
package com.qfedu.test5;public class Student {private String name;private int age;private String sex;public String getSex() {return sex;}public void setSex(String sex) {if(sex.equals("男") || sex.equals("女")) {this.sex = sex;}else {throw new SexNotFoundException("sex error!");}}// alt + s + rpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) throws InputAgeException {if(age >= 0 && age <= 130) {this.age = age;}else {throw new InputAgeException("年龄不合适");}}public static void main(String[] args) {Student stu = new Student();stu.setName("赵四");try {stu.setAge(130);} catch (InputAgeException e) {e.printStackTrace();}stu.setSex("母");}}
package com.qfedu.test5;public class InputAgeException extends Exception{private static final long serialVersionUID = -5819204170683788513L;public InputAgeException(String message) {super(message);}}
package com.qfedu.test5;public class SexNotFoundException extends RuntimeException{private static final long serialVersionUID = 1L;// alt + s 选择从父类生成构造方法public SexNotFoundException(String message) {super(message);}}
