`
bigfang
  • 浏览: 39716 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

异常处理的整理

阅读更多
    其实,异常很久以前就遇到了,一直没整理。对异常的理解还需提高。

    写程序和生活中的情况很相似,会遇到一些异常情况。有些异常能预料到,在程序执行中可能突然发生,可以防患于未然;有些则无法预料。

以下是部分异常继承:


     1.Exception:程序本身可以处理的异常。发生异常,则可以处理。

     2.Error:违反基本原则,由Java虚拟机抛出。如内存空间不足OutofMemory,Java虚拟机的方法调用栈溢出StackOutofMemoryError。出现异常,终止程序执行。


Exception:可分为运行时异常和受检查异常。

   1.1RuntimeException:运行时异常。编译时,不需强制检查异常。用户可根据特定问题创建相关的运行时异常类。一般由于代码错误,执行了错误的操作,引起的异常。

   1.2除RuntimeException以及它的子类,其他的Exception类及其子类都属于受检查异常(Checked Exception)。


               处里异常,有两种方法。
(1)try……catch捕获并处理异常
try {
//可能发生异常的语句

}catch(){
//捕捉并处理异常,中断try中的正常流程,

}finally{
//无论是否有异常,总是会执行的语句,释放被占用的相关资源

}
finally中的语句放try……catch后面,某些情况也能执行,但如果catch中继续抛出异常,则导致catch所在的方法异常终止,就不执行try……catch后面的语句了。


(2)throws,方法的声明处通过throws语句声明抛出异常。
这个方法没有能力处理异常,所以抛出异常,交给上一层方法处理。

    throws 与 throw区别:
throws:在声明方法处,方法 throws 异常类名。
throw:语句执行中使用throw。对象必须为java.lang.Throwable类或其子类的实例。

public static void main(String[] args) {
		testException te=new testException();
		te.testArray();
	}
	
	public void testArray(){
		int[] b=new int[61862000];//超过虚拟机分配内存
		System.out.println("整型数组创建成功");
	}

java.lang.OutOfMemoryError: Java heap space

   属于Error异常类,定义的数组大小超过了虚拟机总共可分配的内存。

public void testNullPointer(){
		String ss=null;
		ss.getBytes();
		System.out.println("调用成功");
	}
java.lang.NullPointerException

RuntimeException运行异常,空指针异常,没有指向指定的内存单元,即没有创建对象。这目前在程序中比较常见。

public static void main(String[] args) {
		testException te=new testException();
		try{
			te.throwAgain();
		}catch(Exception ef){
			ef.printStackTrace();
			System.out.println("处理异常了");
		}
		
	}
	
	public void throwAgain() throws Exception{
		try{
			testThrow(-5);
		}catch(Exception ef){
			ef.printStackTrace();//无此句,则执行后,不显示出现异常的地方
			throw new Exception("此方法无法处理,继续throw给上层");
		}finally{
			System.out.println("finally中语句总是执行");
		}
                System.out.println("finally之后的语句执行了");
	}
	//创建5个单元的数组
	public void testThrow(int num){
		if (num<0){
			throw new IllegalArgumentException("个数不能小于0");
		}
		int a[]=new int [5];
		System.out.println("创建数组成功");
		
	}
   若throw,则后面的语句就不执行了,回到上一层调用的函数。testThrow,回到throwAgain,然后处理上一个函数抛出的异常,由于throwAgain无法处理异常,所以继续上抛异常,此时,try……catch之后的语句就不执行了,最后在main函数里处理了。


由于处理异常,目前使用的不多,所以,以下几句以后慢慢体会了。

    1.出现异常,使用try……catch时,虚拟机搜索方法调用栈来寻找异常处理代码块,如果抛出异常的代码块和处理异常的代码块相隔很多层,找的时间就多了。
    2.避免过于庞大的try代码块。代码块越大,出现异常的情况就越多,分析发生异常的原因就越困难。
    3.catch()中指定具体的异常类型。因为不同的异常执行不同的处理。

  • 大小: 99.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics