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("计算结束"); } }