文档章节

以前没有留意的一个关于Java异常的细节

jkx
 jkx
发布于 2015/02/28 11:54
字数 655
阅读 19
收藏 0

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;
	}
}











© 著作权归作者所有

共有 人打赏支持
jkx

jkx

粉丝 4
博文 5
码字总数 3442
作品 0
海淀
高级程序员
私信 提问
Java中有关Null的9件事

对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢?null出现有一段时间了,并且我认为J...

enosh
2015/01/05
0
0
Java的Exception和Error面试题10问10答

在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题。Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它成为面试题中的...

lwei
2013/10/10
18.2K
48
IBM和SAP开源其JVM诊断工具

IBM最近发布了其Java诊断工具套件,该套件包含如下工具:面向Java的产品转储分析器(Dump Analyzer)、处理垃圾收集(GC,即Garbage Collection)的Extensible Verbose Toolkit和Java锁分析器...

JavaGG
2010/03/24
1K
0
Java本地方法 Native Method

今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。 一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接...

哈全文
2012/09/03
0
0
[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱?

[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱? 曾经的我经常害怕处理与JVM相关的异常,对JVM的配置参数也一无所知,那时候我天真地认为,JVM的出现本身就是想让程序员屏蔽实现细节,...

原创小博客
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
12分钟前
0
0
人工智能时代员工如何证明其IT工作价值

机器人可以取代你的工作吗?你能帮助机器人完成它的工作吗?如果你正在考虑自己的职业生涯以及今后将如何发展,那么应该询问自己这些问题了。 机器人可以取代你的工作吗?你能帮助机器人完成它的...

Linux就该这么学
13分钟前
0
0
CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linuxCool
24分钟前
0
0
使用Autowired和Qualifier解决多个相同类型的bean如何共存的问题

注意: 实现类UserServiceImpl,MyUserServiceImpl 需要区分:@Service("userServicel") @Service("myUserService") https://blog.csdn.net/russle/article/details/80287763......

qimh
58分钟前
4
0
SQL 语句使用to_char函数时,检索结果有空格

小疯在使用Oracle过程中,使用to_char函数检索表数据时发现检索结果前面会有一个空格,对后续开发有影响。问题很好解决,比较直接对可以做一下trim处理。但是小疯很疑惑为什么会有空格呢,于...

野小疯
59分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部