14.异常

异常

常见异常

异常类型 说明
Exception 异常层次结构的父类
ArithmeticException 算数异常,例如零作除数时
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问null对象成员
ClassNotFoundException 无法加载所需类
IIIegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式化转换异常,如把“abc”转换成数字

异常处理

1.规避异常

1.使用一系列的逻辑判断,来提前进行异常情况判断,从而规避异常代码的执行

2.代码冗余、代码可读性差

3.不是所有的异常都能规避,例如:java.util.InputMismatchException

System.out.println("请输入被除数:");
int num1 = input.nextInt(); //java.util.InputMismatchException

2.处理异常

使用try…catch…代码块处理异常

1.将可能出现异常的代码,写在try代码块中

// 测试用例1
	private static void test01() {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入被除数:");
		int num1 = input.nextInt(); // java.util.InputMismatchException
		System.out.println("请输入除数:");
		int num2 = input.nextInt(); // java.util.InputMismatchException
		
//		if (num2 == 0) {
//			System.out.println("除数不能为0");
//			return;
//		}
		
		try {
			System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
		} catch (ArithmeticException e) {
			//e.printStackTrace(); // 打印栈信息,打印异常详细信息
			System.out.println("除数不能为0");
		}
		
		System.out.println("程序结束");
		
		input.close();		
	}

2.catch后编写可能出现的异常类参数(可以用|分隔多个异常,也可以使用异常父类表示所有子类型)

// 测试用例2
	private static void test02() {
		Scanner input = new Scanner(System.in);
		
		try {
			System.out.println("请输入被除数:");
			int num1 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("请输入除数:");
			int num2 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
		} catch (InputMismatchException e1) {
			System.out.println("输入必须是整数");
		} catch (ArithmeticException e2) {
			System.out.println("除数不能为0");
		}
		
		System.out.println("程序结束");
		input.close();	
	}
// 测试用例3
	private static void test03() {
		Scanner input = new Scanner(System.in);
		
		try {
			System.out.println("请输入被除数:");
			int num1 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("请输入除数:");
			int num2 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
		} catch (InputMismatchException | ArithmeticException e) {
			System.out.println("程序出现异常");
		} 
		
		System.out.println("程序结束");
		input.close();	
	}
// 测试用例4
	private static void test04() {
		Scanner input = new Scanner(System.in);
		
		try {
			System.out.println("请输入被除数:");
			int num1 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("请输入除数:");
			int num2 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
		} catch (Exception e) {
			System.out.println("程序出现异常");
		} 
		
		System.out.println("程序结束");
		input.close();	
	}

3.catch代码块编写的是异常情况下的执行代码

4.catch可以多重使用,从而处理可能出现的多种异常

finally代码块的使用

1.无论程序是否出现异常,都将执行的代码(finally优先级高于return,finally执行完后才会执行return)

//唯一不执行的情况
try {
    System.out.println("test");
    System.exit(1);//关闭虚拟机,参数为0正常退出,非0为异常退出
} finally {
    System.out.println("执行finally");//未执行
}

2.finally和catch可以只用其一,也可以一起使用,但是try不能单独使用

	private static void test05() {
		Scanner input = new Scanner(System.in);
		
		try {
			System.out.println("请输入被除数:");
			int num1 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("请输入除数:");
			int num2 = input.nextInt(); // java.util.InputMismatchException
			System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
		} catch (Exception e) {
			System.out.println("程序出现异常");
		} finally {
			System.out.println("finally执行");
		}
		
		System.out.println("程序结束");
		input.close();	
	}

throws关键字声明异常

1.用来声明方法可能出现的异常

2.方法本身无需处理异常

3.方法的调用者处理异常

private static void test06() throws Exception {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入被除数:");
		int num1 = input.nextInt(); // java.util.InputMismatchException
		System.out.println("请输入除数:");
		int num2 = input.nextInt(); // java.util.InputMismatchException
		System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
		
		System.out.println("程序结束");
		input.close();	
	}

throw关键字的使用

1.用在方法体中,用于抛出异常,例如:throw new Exception(“姓名不能是lucy”);

private static void test07() throws Exception {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入姓名:");
		String name = input.next();
		
		if (name.equals("lucy")) {
			throw new Exception("姓名不能是lucy");
		}
		
		System.out.println(name);
		input.close();	
	}

异常的分类

1.异常体系架构图

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTmDoRD7-1648356738902)(E:\note\img\java异常架构图.png)]

2.编译时异常:要求程序员必须处理(声明或者try),在程序编译过程中就会出现的错误。

3.运行时异常:可以不处理,在程序运行时可能出现的错误。

自定义异常类

1.继承Exception类创建编译时自定义异常

2.继承RuntimeException类创建运行时自定义异常

	input.close();	
}



## 异常的分类

1.异常体系架构图

​		[外链图片转存中...(img-xTmDoRD7-1648356738902)]

2.编译时异常:要求程序员必须处理(声明或者try),在程序编译过程中就会出现的错误。

3.运行时异常:可以不处理,在程序运行时可能出现的错误。



## 自定义异常类

1.继承Exception类创建编译时自定义异常

2.继承RuntimeException类创建运行时自定义异常



你可能感兴趣的:(javanote,java)