Java异常的抛出

来自CloudWiki
跳转至: 导航搜索

异常处理原则

  • 具体明确
  • 提早抛出
  • 延迟捕获

具体明确指的是在抛出异常时需要针对具体问题来抛出异常,抛出的异常要足够具体详细

提早抛出的基本目的还是为了防止问题扩散,这样出现异常的话排查起来会比较耗时,比较典型的一种情况是 NPE(NullPointerException),当某个参数对象为null时,如果不提早判断并抛出异常的话,这个null可能会藏的比较深,等到出现NPE时就需要往回追溯代码了。这样就给排查问题增加了难度。所以我们的处理原则是出现问题就及早抛出异常。

延迟捕获说的是对异常的捕获和处理需要根据当前代码的能力来做,如果当前方法内无法对异常做处理,即使出现了检查异常也应该考虑将异常抛出给调用者做处理

异常的抛出

throws 语句

如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

下面方法的声明抛出一个 RemoteException 异常:

import java.io.*;
public class className
{
  public void deposit(double amount) throws RemoteException
  {
    // Method implementation
    throw new RemoteException();
  }
  //Remainder of class definition
}

一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

例如,下面的方法声明抛出 RemoteException 和 InsufficientFundsException:

import java.io.*;
public class className
{
   public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
   {
       // Method implementation
   }
   //Remainder of class definition
}

try catch是直接处理,处理完成之后程序继续往下执行,throw则是将异常抛给它的上一级处理,程序便不往下执行了。

===试一试:捕获算术异常===:

package exception;

public class TestException {

	 public static void divide(int i,int j) throws Exception {
         
         if(j==0){ throw new ArithmeticException();} 
         int temp = i/j;                        //此处会产生异常
         System.out.println("计算结果:"+temp);
         
    }
	 
	public static void main(String[] args)  {
		 try{
			 divide(5,0);	
	    }catch(Exception e){//处理抛出的异常。
	         System.out.println("出现异常:"+e);    //打印异常信息
	       //e.printStackTrace();            //打印完整的异常信息
	    }		
	    System.out.println("计算结束");
	           
	}

}

练一练:捕获数组异常