java 异常机制

下面是java异常类的层次图:
java.lang.Object
  java.lang.Throwable
      java.lang.Exception
        java.lang.RuntimeException
      java.lang.Error
        java.lang.ThreadDeath

1、Throwable
        Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
两个子类的实例Error 和 Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。

2、Exception
        Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件,表示程序本身可以处理的异常。

3、Error
        Error 是 Throwable 的子类,表示仅靠程序本身无法恢复的严重错误,用于指示合理的应用程序不应该试图捕获的严重问题。
在执行该方法期间,无需在方法中通过throws声明可能抛出但没有捕获的 Error 的任何子类,因为Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。

4、RuntimeException
        RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过,这种异常可以通过改进代码实现来避免。

5、ThreadDeath
        调用 Thread 类中带有零参数的 stop 方法时,受害线程将抛出一个 ThreadDeath 实例。
        仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例。如果 ThreadDeath 被一个方法捕获,那么将它重新抛出非常重要,因为这样才能让该线程真正终止。
如果没有捕获 ThreadDeath,则顶级错误处理程序不会输出消息。
        虽然 ThreadDeath 类是“正常出现”的,但它只能是 Error 的子类而不是 Exception 的子类,因为许多应用程序捕获所有出现的 Exception,然后又将其放弃。

        以上是对有关异常API的一个简单介绍,用法都很简单,关键在于理解异常处理的原理,具体用法参看Java API文档。

下面是一个有关异常处理的逻辑代码:
public class ExceptionTest {

	public static void main(String args[]){
		
		function1();
		System.out.println("do in main");
	}
	static Exception1 exp1;
	private static void function1(){
		exp1=new Exception1();
		try{
		   System.out.println("t3");
		   throw new Exception2();
                      //unreached code
		}catch(Exception2 e2){
			System.out.println("t1");
			try{
				throw exp1;
				//System.out.println(1/0);
				//System.out.println("dddd");
			}catch(Exception e){
				System.out.println("t2");
			}finally{
				System.out.println("t5");
			}
		}finally{
			System.out.println("t4");
		}
			
		
	}
	
	private static void function2(){
		System.out.println("do in function2");
	}
	
	private static void function3(){
		System.out.println("do in function3");
	}
}

class Exception1 extends Exception{
	
	public void println(String str){
		System.out.println("Exception1 :"+str);
	}
}

class Exception2 extends Exception{
	
}


输出结果:
t3
t1
t2
t5
t4
do in main

由上可知:
当程序抛出异常后,由相应的捕获代码捕获异常,抛出异常语句后面的代码将不再执行。而是向上执行,知道调用该方法的地方,然后继续向下执行。
try catch语句是可以嵌套使用的,finally语句始终被执行。

你可能感兴趣的:(java,thread,虚拟机)