Thread.UncaughtExceptionHandler简单小实践

在Java 的异常处理机制中:
如果抛出的是Exception异常的话,必须有try..catch..进行处理,属于checked exception。
如果抛出的是RuntimeException异常的话,则不是必须进行try..catch..异常处理,发生异常之后将由JVM进行处理,属于unchecked exception。
注意:为了保证程序的健壮性,建议抛出RunntimeException异常,也使用try..catch..进行处理。

这两者最本质的区别在于设计者认为使用者是否能够并且应该处理这个异常。

Java 异常的分类:
基类为:Throwable
Error 和 Exception 继承于Throwable
RuntimeException和IOException等继承Exception
其中,Error和RuntimeException及其子类属于unchecked exception, 而其他异常为checked exception。

Error类描述了Java运行系统中的内部错误以及资源耗尽的情形,应用程序不应该抛出这种类型的对象(一般是由Java虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在我们在程序设计时,应该更关注Exception体系。

RuntimeExcption体系,包括错误的类型转换,数组越界访问和试图访问空指针等等。如果出现RuntimeException,那么一定是你自己的错误。

其他非RuntimeExcetpion(IOException等等),这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

package com;

public class ThreadDemo implements Thread.UncaughtExceptionHandler {

	@Override
	public void uncaughtException(Thread t, Throwable e) {
		StackTraceElement[] stes = e.getStackTrace();
		for (StackTraceElement stackTraceElement : stes) {
			String className = stackTraceElement.getClassName();
			String fileName = stackTraceElement.getFileName();
			int lineNumber = stackTraceElement.getLineNumber();
			String methodName = stackTraceElement.getMethodName();
			System.out.println("Exception in thread \"" + t.getName() + "\" "
					+ e + "\n" + "at " + className + "." + methodName + "("
					+ fileName + ":" + lineNumber + ")");
		}
	}

	public static void main(String[] args) {
		Thread.setDefaultUncaughtExceptionHandler(new ThreadDemo());
		int a = 1 / 0;
		new Thread() {
			public void run() {
				int b = 2 / 0;
			};
		}.start();
	}
}

猜你喜欢

转载自n-wang.iteye.com/blog/2200439