异常

1.异常处理

1.1 try-catch

try 尝试,表示将可能出现异常的代码存放在try中
try不能单独出现,必须结合catch或者finally使用
catch 捕获,表示捕获对应的异常在catch代码块中处理
情况1:
捕获的异常和出现的异常相同,可以捕获到异常,不会中断程序

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 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 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 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 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 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使用

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中的代码,还使用最初确定的返回值

public static void main(String[] args) {
	System.out.println(m1());  //11
}
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 表示声明异常
throw和throws的区别
| throw | throws |
| ---- | ---- |
| 生成并抛出异常 | 声明方法内抛出了异常 |
| 位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后边,不能单独使用 |
| 抛出一个异常对象,且只能是一个 | 声明抛出异常对象,可以跟多个异常 |

import java.io.FileNotFoundException;
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中的异步类型不能满足程序的需要时,可以自定义异常类

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 + r
	public 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("母");
	}
}
public class InputAgeException extends Exception{

	private static final long serialVersionUID = -5819204170683788513L;	
	public InputAgeException(String message) {
		super(message);
	}

}
public class SexNotFoundException extends RuntimeException{

	private static final long serialVersionUID = 1L;
	// alt + s 选择从父类生成构造方法
	public SexNotFoundException(String message) {
		super(message);
	}
}
posted @ 2021-07-24 15:16  码丁XIA  阅读(45)  评论(0)    收藏  举报