以前没有留意的一个关于Java异常的细节
博客专区 > jkx 的博客 > 博客详情
以前没有留意的一个关于Java异常的细节
jkx 发表于3年前
以前没有留意的一个关于Java异常的细节
  • 发表于 3年前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: Java异常类java.lang.Excepton有n多的子类,有些异常在程序编写阶段就必须捕获或抛出,比如IOException,有些是不需要在编写阶段捕获或抛出的,比如ArrayIndexOutOfBoundsException。那么程序员自己定义的Exception怎么根据编译器的规则实现这两类异常呢?

Java异常类java.lang.Excepton有n多的子类,有些异常在程序编写阶段就必须捕获或抛出,比如IOException,有些是不需要在编写阶段捕获或抛出的,比如ArrayIndexOutOfBoundsException。那么程序员自己定义的Exception怎么根据编译器的规则实现这两类异常呢?

其实众多的Java异常类可按照某种继承方式分为两类:1.继承自RuntimeException的;2.直接继承自Exception。

一、继承自RuntimeException

从jdk文档的描述中可以看到,RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。也就是说,继承自RuntimeException的异常编译器不强制程序员显式的捕获或抛出

比如前面提到的ArrayIndexOutOfBoundsException就是这种继承结构:

举个自定义的栗子:

public class AddZeroException extends RuntimeException {
	public AddZeroException(String message) {
		super(message);
	}
}

AddZeroException在使用的时候就不需要在throws子句中声明。

public class TestException {
	public static void main(String[] args) {
		int a = 4; 
		int b = 3;
		int c = 0;
		
		System.out.println(add(a, b));
		System.out.println(add(a, c));
	}
	
	// add方法不需要在throws中声明AddZeroException。
	public static int add(int a, int b)
	 {
		if(a == 0 || b == 0) {
			throw new AddZeroException("应有关部门要求,请不要将任何一个数和0相加!");
		}
		
		return a + b;
	}
}

二、直接继承自Exception

这种异常是必须要在throws子句中声明的,而且客户端程序员在调用的时候必须显式进行捕获或抛出。

比如前面提到的IOException就是这种继承结构

举个自定义的栗子:

public class AddZeroException extends Exception {
	public AddZeroException(String message) {
		super(message);
	}
}

在使用该异常的地方就必须在throws子句中声明,如果不声明和不显式捕获则编译不通过。

public class TestException {
	public static void main(String[] args) {
		int a = 4;
		int b = 3;
		int c = 0;

		// 此处必须try-catch。
		try {
			System.out.println(add(a, b));
			System.out.println(add(a, c));
		} catch (AddZeroException e) {
			e.printStackTrace();
		}
	}

	public static int add(int a, int b) throws AddZeroException { // 此处必须声明。
		if (a == 0 || b == 0) {
			throw new AddZeroException(
					"根据开发经理的要求,请不要将任何一个数和0相加!");
		}

		return a + b;
	}
}











共有 人打赏支持
粉丝 5
博文 5
码字总数 3442
×
jkx
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: