文档章节

以前没有留意的一个关于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
IBM和SAP开源其JVM诊断工具

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

JavaGG
2010/03/24
0
0
linux sun/awt/X11GraphicsEnvironment 图片处理问题

关于 在linux 上出现 Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11.XToolkit 问题 搜索到如下资料: 在Linux下,我们在用java的图片包来处理图片时,...

肥皂泡2
2011/07/14
0
0
native关键字初识--java调用非java代码的接口

Java基础知识——JNI入门介绍(上) Java™ 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成。如果您希望利用已有的代...

成长中的菜鸟
2015/02/10
0
0
Java OutOfMemoryError 的原因是什么,什么是Java native方法

一、Java OutOfMemoryError 的原因是什么,什么是Java native方法?转载的博文 容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。 常见的几种错误: 1.1 OutO...

Oscarfff
2015/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
4
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
17
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部