张龙 Exception学习笔记

1.Java中的异常分为两大类:
a) Checked exception (非 Runtime Exception)
b) Unchecked exception(Runtime Exception)

 

2.Java中所有的异常类都会直接或间接地继承自Exception,RuntimeException类也是直接继承自Exception类,它叫做运行时异常,Java中所有的运行时异常都会直接或间接地继承自RuntimeException,Java中凡是继承自Exception而不是继承RuntimeException的类都是非运行时异常。

 

3.异常处理的一般结构是:
try
{
}
catch(Exception e)
{
}
finally
{
}
无论程序是否出现异常,finally块中的代码都是会被执行的。

 

4.对于非运行时异常(checked exception),必须要对其进行处理,处理方式有两种:第一种是使用try.. catch…finally进行捕获;第二种是在调用该会产生异常的方法所在的方法声明throws Exception

举例1:ExceptionTest.java

 

package com.shengsiyuan.exception;

public class ExceptionTest
{
	public static void main(String[] args)
	{
		int c = 0;
		
		try
		{
			int a = 3;
			int b = 0;
			
			c = a / b;
			
			System.out.println("hello world");
		}
		catch(ArithmeticException e)
		{
			e.printStackTrace();
		}
		finally
		{
			System.out.println("welcome");
		}
		
		
		System.out.println(c);
	}
}

 

举例2:ExceptionTest2.java

 

package com.shengsiyuan.exception;

public class ExceptionTest2
{       
        //在方法声明的时候要抛出异常使用的是throws关键字
	public void method() throws Exception
	{
		System.out.println("hello world");
		
                //在方法体要抛出异常里面使用的是throw关键字
                //方法体里面一旦出现了throw关键字,方法定义的时候就必须跟着throws关键字,否则会报错
		throw new Exception();
	}
	
	public static void main(String[] args)
	{
		ExceptionTest2 test = new ExceptionTest2();
		
		try
		{
			test.method();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			System.out.println("aaa");
		}
		
		
	}
}

  

5.对于运行时异常(runtime exception),我们可以不对其进行处理,也可以对其进行处理。推荐不对其进行处理。

6.NullPointerException是空指针异常,出现该异常的原因在于某个引用为null,但你
却调用了它的某个方法。这时就会出现该异常。

 

举例:ExceptionTest3.java

 

package com.shengsiyuan.exception;

public class ExceptionTest3
{
	public static void main(String[] args)
	{
		String str = null;
		
		System.out.println(str.length());
	}
}

 

7.所谓自定义异常,通常就是定义了一个继承自Exception类的子类,那么这个类就是一个自定义异常类。通常情况下,我们都会直接继承自Exception类,一般不会继承某个运行时的异常类,自定义异常一般是为了在标准异常里加入一些自己独特的信息。

8.我们可以使用多个catch块来捕获异常,这时需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch可能被执行,否则子类型的catch将永远无法到达,Java编译器会报编译错误;如果多个catch块的异常类型是独立的(MyException, MyException2), 那么谁前谁后都是可以的。

举例: MyException,MyException2,Exception4

package com.shengsiyuan.exception;

public class MyException extends Exception
{
	public MyException()
	{
		super();
	}
	
	public MyException(String message)
	{
		super(message);
	}
}

 

package com.shengsiyuan.exception;

public class MyException2 extends Exception
{
	public MyException2()
	{
		super();
	}
	
	public MyException2(String message)
	{
		super(message);
	}
}

 

package com.shengsiyuan.exception;

public class ExceptionTest4
{
	public void method(String str) throws Exception
	{
		if(null == str)
		{
			throw new MyException("传入的字符串参数不能为null");
		}
		else if("hello".equals(str))
		{
			throw new MyException2("传入的字符串不能为hello");
		}
		else
		{
			System.out.println(str);
		}
	}
	
	public static void main(String[] args)
	{
		try
		{
			ExceptionTest4 test = new ExceptionTest4();
			
			test.method("hello");
		}
		catch(MyException e)
		{
			System.out.println("进入到MyException catch块");
			e.printStackTrace();
		}
		catch(MyException2 e)
		{
			System.out.println("进入到MyException2 catch块");
			e.printStackTrace();
		}
		catch(Exception e)
		{
			System.out.println("进入到Exception catch块");
			e.printStackTrace();
		}
		finally
		{
			System.out.println("异常处理完毕");
		}
		
		System.out.println("程序执行完毕");
		
	}
}

 

说明:

a)如果一个方法抛出了异常,另外一个方法调用这个方法的时候,可以有2种处理办法:要么try--catch--finally,要么继续往上抛,第一种处理方式容易理解,没什么好说的,如果是第二种处理方式,即继续往上抛,最高层可以抛到main方法,main方法可以捕获异常然后进行处理,也可以继续往外抛,此时,是抛给JVM去进行处理了。
    继续往上抛与try--catch的区别是如果程序执行过程中发生异常,处理方式如果为往上抛的话程序就不会继续往下执行,就在发生异常的地方中止了,后面的代码不会执行,如果是try--catch,发生异常后程序进入catch,执行完后会接着执行下面的代码,也就是说就算发生异常,程序也不会中止执行,依然会跑下去。

 

b)关于自定义异常:实际项目中经常要用到自定义异常,一般使用情况是程序抛出了一个java预定义的异常,我们  catch住后,将该异常包装为自定义的异常,然后抛出去,这样我们写的方法声明的时候就只会抛自定义的异常,而不会再去抛java自带的异常。

 

9.Exception常见面试题

   举例:ExceptionTest5

  

package com.shengsiyuan.exception;

public class ExceptionTest5
{
	public void method() 
	{
		try
		{
			System.out.println("进入到try块");
			
                        //return
                         
			System.exit(0);
		}
		catch(Exception ex)
		{
			System.out.println("异常发生了");
		}
		finally
		{
			System.out.println("进入到finally块");
		}
		
		System.out.println("异常处理后续的代码");
	}
	
	public static void main(String[] args)
	{
		ExceptionTest5 test = new ExceptionTest5();
		
		test.method();
	}
}

 

 说明:

 a)如果在try代码块里出现了return,那程序执行到return时并不会立即return,而是会继续把finally代码块里面的代码 执 行完,然后返回,切记。

 b)如果try块中存在System.exit(0)语句,那么就不会执行finally块中的代码,因为System.exit(0)会终止当前运行的Java虚拟机,程序会在虚拟机终止前结束执行。

       

posted @ 2011-08-06 22:49  focus~wow  阅读(116)  评论(0编辑  收藏  举报