文档章节

以前没有留意的一个关于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
native关键字初识--java调用非java代码的接口

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

成长中的菜鸟
2015/02/10
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
Java OutOfMemoryError 的原因是什么,什么是Java native方法

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

Oscarfff
2015/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

angular 解决其他电脑不能访问的问题。

ng serve --host 0.0.0.0 --disable-host-check

miaojiangmin
今天
1
0
优酷视频文件怎么转换格式

  以前在优酷上下载视频都只是在手机上观看,但随着科技的发展,对于视频的要求也逐渐增多,不再只是观看视频那么简单,在精彩的部分还会将其单独分割出来,然后进行视频剪辑,可以做出我们...

萤火的萤火
今天
0
0
数据结构:散列

在一个数据结构中查找key元素,用顺序查找、二分查找都需要经过一系列关键之比较才能查找到结果,平均查找长度与数据量有关,元素越多比较次数就越多。 如果根据元素的关键字就能知道元素的存...

京一
今天
0
0
Apache RocketMQ 正式开源分布式事务消息

近日,Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消...

阿里云云栖社区
今天
30
0
使用JavaScript和MQTT开发物联网应用

如果说Java和C#哪个是最好的开发语言,无疑会挑起程序员之间的相互怒怼,那如果说JavaScript是动态性最好的语言,相信大家都不会有太大的争议。随着越来越多的硬件平台和开发板开始支持JavaS...

少年不搬砖老大徒伤悲
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部