Java的异常分类

Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。

编译时被检查异常:(Checked异常)在程序中必须使用try…catch处理;
编译时不被检测的异常:(Runtime异常)可以不使用try…catch处理,但一旦出现异常就将由JVM处理。

1、异常的分类之 Runtime 异常(所有的RuntimeException类及其子类的实例)

RuntimeException(运行时异常)是指因设计或实现方式不当而导致的问题。说白了,就是程序员造成的,程序员小心谨慎是完全可以避免的异常。比如:
事先判断对象是否为 null 就可以避免NullPointerException 异常;
事先检查除数不为0就可以避免ArithmeticException 异常。
特点:这种异常Java编译器不会检查它,也就说程序中出现这类异常的时候。即使不处理也没有问题,但是一旦出现异常,程序将异常终止,若采用异常处理,则会被相应的程序执行处理。

2、异常的分类之 Checked 异常(不是RuntimeException类及其子类的异常实例)

除了 RuntimeException 以及子类,其他的 Exception 及其子类都是受检查异常。我们也可以称为非 RuntimeException 异常。
特点: Java 编译器会检查它,也就说程序中一旦出现这类异常,要么是没有 try-catch 语句捕获。或 throws 语句没有声明抛出它,编译就不会通过,也就说这种异常,程序要求必须处理。

3、声明异常(throws)

在可能出现异常的方法上声明抛出可能出现异常的类型:声明的时候尽可能声明具体的异常,方便更好的处理。当前方法不知道如何处理这种异常,可将该异常交给上一级调用者来处理(非 RuntimeException 类型的异常)。方法一旦使用 throws 声明抛出方法内可能出现的异常类型,该方法就可以不再过问该异常了;一个方法调用另一个使用 throws 声明抛出的方法,自己要么 try…catch , 要么也 throws。
格式:
在这里插入图片描述

4、声明异常(throw)

自行抛出一个异常对象,抛出异常类的对象; 若 throw 抛出的是 Runtime 异常: 程序可以显示使用 try…catch 来捕获并处理,也可以不管,直接交给方法调用者处理; 若 throw 抛出 Checked 异常: 要么放在 try 里自己处理,要么放在一个 throws 声明的方法里面,交给调用者处理。
示例代码:
在这里插入图片描述

public class Demo {
	public static void main(String[] args) {
		try {
			fn1(1);
		} catch (Exception e) {
			e.printStackTrace();
		}
		fn2(2);
	}
	public static void fn1(int a) throws Exception {
		if (a > 0) {
			throw new Exception("fn1 -- a 值不合法");
		}
	}
	public static void fn2(int a) {
		if (a > 0) {
			throw new RuntimeException("a 值不合法");
		}
	}
}

结果截图:
在这里插入图片描述
throws 与 throw 的区别:
throws 用于在方法上声明该方法不需要处理的异常类型。throw 用于抛出具体异常类的对象。
thorws 用在方法上,后面跟异常类名,可以是多个异常类。throw 用在方法内,后面跟异常对象,只能是一个。

5、finally 异常的统一出口:

不管 try 块程序是否异常,也不管哪个 catch 执行,finally 块总会执行。 try 语句块或会执行的 catch 语句块使用了 JVM 系统退出语句例外;//System.exit(1); try 块必须和 catch 块或和 finally 同在,不能单独存在,二者必须出现一个。 不要在 finally 中使用 return 或 throw 语句,否则将会导致 try、catch 中的 return 或 throw 失效。
总结:finally 代码块只在一种情况下不执行:System.exit(0);
示例代码:
在这里插入图片描述

public class Demo {
	public static void main(String[] args) {
		try {
			System.out.println(17 / 0);
		} catch (Exception e) {
			// e.printStackTrace();
			System.out.println("程序错误,请修正!");
		} finally {
			System.out.println("这是finally代码块!");
		}
	}
}

结果截图:
在这里插入图片描述

6、throw 和 catch 同时使用

当异常出现在当前方法中,程序只对异常进行部分处理,还有一些处理需要在方法的调用者中才能处理完成。此时还应该再次抛出异常,这样就可以让方法的调用者也能捕获到异常。
示例代码:
在这里插入图片描述

public class Demo {
	public static void main(String[] args) {
		try {
			buy("五块");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	public static void buy(String price) throws Exception {
		try {
			if (price != null)
				Double.parseDouble(price);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("价格只能是数字组成");
		}
	}
}

结果截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值