异常

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中的代码,但输出为try中的值

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-23 18:36  you_rgb  阅读(78)  评论(0)    收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中