TIJ学习笔记-异常

java异常

参考博客:http://www.cnblogs.com/focusj/archive/2011/12/26/2301524.html

http://tech.ccidnet.com/art/3737/20030721/468063_1.html

1. 什么是异常:

阻止当前方法或作用域继续执行的问题。

2.  异常分类

Throwable是一切异常或错误的根类。一切皆可抛。

Error和Exception是Throwable是的两个子类。

Error:应用程序不应试图捕获的严重问题[编译时和系统错误]。交由jvm处理。

Exception:可以被抛出的基本类型。它分为两类CheckedException和UncheckedException.

CheckedException需要用try catch显示的捕获。

UncheckedException不需要显示的捕获。

对于可恢复的条件使用CheckedException.对于程序错误,使用UncheckedException(又叫RuntimeException).

3. 常见RuntimeException

NullPointerException:空指针异常。

NumberFormatException:继承IllegalArgumentException。

ArrayIndexOutOfBoundsException:数组越界

StringIndexOutOfBoundsException:字符串越界

ClassCastException:类型转换错误

ArithmeticException:算术错误,典型的就是0作为除数的时候。

IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常。

4.  异常链

捕获一个异常后,在抛出另一个异常,并且把原始异常信息保存下来。被称为异常链。用initCause()方法链接其它类型异常。

package com.zhiru;
/*
 * 异常丢失
 * 异常链:用initCause()构造异常链.
 */
class ExceptionA extends Exception{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public ExceptionA(){
		super();
	}
}
class ExceptionB extends Exception{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public ExceptionB(String str){
		super(str);
	}
}
class ExceptionC extends Exception{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public ExceptionC(String s){
		super(s);
	}
}
public class MyException {

	public static void f1() throws ExceptionB{
		throw new ExceptionB("ExceptionB throws");
	}
	public static void f2() throws ExceptionC{
		try{
			f1();
		} catch(ExceptionB e){
			ExceptionC c=new ExceptionC("ExcptionC throwed");
			c.initCause(e);//构造异常链
			throw c;
		}
	}
	public static void main(String[]args){
		try{
			f2();
		} catch(ExceptionC e){
			e.printStackTrace();
		}
	}
}
/*
 * com.zhiru.ExceptionC: ExcptionC throwed
	at com.zhiru.MyException.f2(MyException.java:42)
	at com.zhiru.MyException.main(MyException.java:48)
*/
/*
 * com.zhiru.ExceptionC: ExcptionC throwed
	at com.zhiru.MyException.f2(MyException.java:45)
	at com.zhiru.MyException.main(MyException.java:52)
Caused by: com.zhiru.ExceptionB: ExceptionB throws
	at com.zhiru.MyException.f1(MyException.java:39)
	at com.zhiru.MyException.f2(MyException.java:43)
	... 1 more

 * 
 * */


5.  finally

无论try中抛出什么异常,finally中的子句总能被执行。

把除内存之外的资源恢复到它们的初始状态时,使用finally子句.

package com.zhiru;

public class ExceptionSilencer {

	@SuppressWarnings("finally")
	public static void f(int i) {
		try {
			System.out.println("intering...");
			System.out.println(1);
			if (i == 1)
				return;
			System.out.println(2);
			if (i == 2)
				return;
			System.out.println(3);
			if (i == 3)
				return;
			System.out.println("end");
			return;
		} finally {
			return;
			// System.out.println("clean up");

		}
	}

	 public static void main(String[] args) {
	 // TODO Auto-generated method stub
	 // try{
	 // throw new RuntimeException();
	 // }
	 // finally{
	 // return;//在子句中返回,即使抛出异常,但不会输出。
	 // }
	 for(int i=1;i<=4;i++)
	 f(i);
	
	 }

}
/*
 * intering...
1
intering...
1
2
intering...
1
2
3
intering...
1
2
3
end*/


6.  return中的finally

应为finally子句总会执行,所以在类内,从何处return无关紧要。

7.  异常丢失

class A extends Exception{

public String toString(){

return “A catch”;

}

}

class B extends Exception{

public String toString(){

return “B catch”;

}

}

public class LostException{

void f() throws A{

throw new A();

}

void g() throws B{

throw new B();

}

main(){

try{

LostException le=new LostException();

try{

le.f();

}finally{

le.g();

}

}catch(Exception e){

System.out.println(e);

}

}

}

输出:B catch

8. 构造器中的清理

在构造器中可能抛出异常的类,清理工作要利用嵌套的try子句。

try{

//…

try{

//…

}catch(Exception e){

}finally{

//清理工作

}

}catch(Exception e){

}

9. 抛出异常后发生了什么

1)    在堆上创建异常对象

2)    当前执行终止,并弹出异常对象的引用

3)    异常处理程序接管程序,并寻找异常处理程序继续执行程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值