异常的分类

在Java编程语言中,异常有三种分类。java.lang.Throwable类充当所有对象的父类,可以使用异常处理机制将这些对象抛出并捕获。在Throwable类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有Error和Exception两个基本子类。

Throwable类不能使用,而使用子类异常中的一个来描述任何特殊异常。每个异常的目的描述如图:

Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

RuntimeException表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。比如,如果数组索引扩展不超出数组界限,那么,ArrayIndexOutOfBoundsException异常从不会抛出。比如,这也适用于取消引用一个空值对象变量。因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。这会导致一个运行时信息,应确保能采取措施更正问题,而不是将它藏到谁也不注意的地方。

其它异常表示一种运行时的困难,它通常由环境效果引起,可以进行处理。例子包括文件未找到或无效URL异常(用户打了一个错误的URL),如果用户误打了什么东西,两者都容易出现。这两者都可能因为用户错误而出现,这就鼓励程序员去处理它们。

公共异常

Java编程语言提供几种预定义的异常。下面是可能遇到的更具共同性的异常中的几种:

ArithmeticException:整数被0除,运算得出的结果。

int i = 12 / 0;

NullPointerException:当对象没被实例化时,访问对象的属性或方法的尝试:

Date d = null;

System.out.println(d.toString());

NegativeArraySizeException:创建带负维数大小的数组的尝试。

ArrayIndexoutofBoundsException:访问超过数组大小范围的一个元素的尝试。

SecurityException:典型地被抛出到浏览器中,SecurityManager类将抛出applets的一个异常,该异常企图做下述工作(除非明显地得到允许):

访问一个本地文件

打开主机的一个socket,这个主机与服务于applet的主机不是同一个。

在运行时环境中执行另一个程序

异常的处理机制

一般来说,异常的处理机制有以下三种:

try-catch-finally  主动异常处理

throws 消极异常处理

throw 引入异常

实例分析

例1

问题的描述:

写一个常见的异常

解决方案:

请看下例:

public class TestException {
	public static void main(String args[]) {
		int i = 0;

		String ss[] = { "Hello world!", "您好,世界!", "HELLO WORLD!!" };

		for (; i < 6; i++) {
			System.out.println(ss[i]);
		}
	}
}

 运行的结果为如图。

要处理异常,将能够抛出异常的代码放入try块中,然后创建相应的catch块的列表,每个可能被抛出异常都有一个。如果生成的异常与catch中提到的相匹配,那么catch条件的块语句就被执行。在try块之后,可能有许多catch块,每一个都处理不同的异常。

请看下例:

class TestException2 {
	public static void main(String args[]) {
		int i = 0;

		String ss[] = { "Hello world!", "您好,世界!", "HELLO WORLD!!" };

		for (; i < 5; i++) {
			try {
				System.out.println("第" + (i + 1) + "次循环:");
				System.out.println(ss[i]);
			} catch (Exception e) {
				System.out.println("数组越界");
			} finally {
				System.out.println("finally execute");
			}
		}
	}
}

 运行的结果如图

总结:从上例可以看出:不管出现不出现异常,finally语句块都会执行。在try语句块里除了System.exit(int)语句外,finally语句块必须执行。

Throws则是自己不处理异常,而交给上级处理,俗称“异常上抛”,比如:

public static void main(String args) throws RuntimeException

这样,一旦在代码里出现RuntimeException,在本类里不做任何处理动作,而是交由上次程序或者虚拟机去处理。

自定义异常

用户定义异常是通过扩展Exception类来创建的。这种异常类可以包含一个"普通"类所包含的任何东西。下面就是一个用户定义异常类例子,它包含一个构造函数、几个变量以及方法

请看下例: 

class TestMyException {
	public static void main(String[] args) {
		ABC abc = new ABD();// ABD 是 ABC的子类
		try {
			abc.a(5);
		} catch (EA e) {
			e.test();
		}
	}
}

 创建自己的运行时异常,如果改成Exception,就是创建编译时的异常了,编译的时候就应该对异常处理。

class EA extends RuntimeException {
	String s;

	public EA(String s) {
		this.s = s;
	}

	public EA() {
	}

	public void test() {
		System.out.println(s);
	}
};

class EA1 extends EA // 创建自己的异常的子异常
{
	public EA1(String s) {
		super(s);
	}
};

class EA2 extends EA // 创建自己的异常的子异常
{
	public EA2(String s) {
		super(s);
	}
};

class ABC {
	public void a(int i) {
		if (i < 0)
			System.out.println("normal");
		else
			throw new EA("no normal");
	}
};

class ABD extends ABC {
	public void a(int i) {
		if (i < 0)
			System.out.println("dfsdafds");
		else if (i == 0)
			throw new EA1("参数 == 0");
		else
			throw new EA2("参数 > 0");
	}
};

 

 

运行的结果为:

 参数 > 0

更多Java视频教程

posted @ 2012-03-06 16:32  JAVA教程  阅读(540)  评论(0)    收藏  举报