首页 > 代码库 > java异常机制

java异常机制

java异常机制主要依赖于try,catch,finally,throw,throws五个关键字,其中try关键字后紧跟一个花括号(不可省略,即使只有一行代码),里面放置可能引发异常的代码。catch后对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块。多个catch块后面还可以跟一个finally块,用于回收在try块中打开的物理资源,异常机制会保证finally块总被执行,throws块在方法签名中使用,用于声明方法可能抛出的异常。而throw可以单独作为一个语句使用,用于抛出一个具体的异常。

java异常分为Checked异常和Runtime异常,Checked异常都是可以在编译阶段被处理的异常,所有java强制处理所有的Checked异常
Runtime异常则无须处理。

Java把非正常情况分为两种,异常(Exception)和错误(Error),他们都继承Throwable父类

Error错误一般指虚拟机相关问题,如系统崩溃,虚拟机出错误,动态链接失败等,这种错误无法恢复或不可能捕获,将导致程序中断。通常应用程序无法处理这些错误。

Exception异常......

异常捕获时,所有父类异常的catch块应都排在子类异常catch块的后面(即先处理小异常,再处理大异常)否则将出现编译错误。

通常情况下,一般方法执行到return或throw语句时,程序将立即结束该方法,但如果有finally块则一定会先执行finally块里的代码,然后才执行return或throw语句结束方法。除非使用System.exit(1)语句来推出虚拟机,否则finally块一定会被执行。

通常情况下、不要在finally块中使用如return或throw等导致方法终止的语句,否则将会导致try块、catch块中的return、throw语句失效。

使用throws声明抛出异常时,有一个限制:子类方法中声明抛出的异常类型应该是父类方法声明抛出异常类型的子类或相等,子类方法中不允许比父类方法声明抛出更多的异常。

自定义异常类模版示例:
public class AuctionException extends Exception
{
 public AuctionException(){}
 public AuctionException(String msg)
 {
  super(msg);
 }
}

异常处理的方式有两种
1 在出现异常的方法内捕获并处理异常,该方法的调用者将不能再次捕获该异常
2 该方法签名中声明抛出异常,将该异常完全交给方法调用者处理

示例:通过多个方法协作处理一个异常的情形
public class TestAuction {

 /**
  * @param args
  */
 private double initPrice = 30.0;
 public void bid(String bidPrice)throws AuctionException{
  double d = 0.0;
  try{
   d = Double.parseDouble(bidPrice);
  }
  catch(Exception e){
   e.printStackTrace();
   throw new AuctionException("输入错误");
  }
  if(initPrice>d){
   throw new AuctionException("数值太小");
  }
  initPrice = d;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  TestAuction ta = new TestAuction();
  try{
   ta.bid("10");
  }
  catch(AuctionException e){
   System.out.println(e.getMessage());
  }
 }

}

把底层的原始异常直接传给用户是一种不负责任的行为,通常的做法是:程序先捕获原始异常,然后抛出一个新的业务异常,新的业务异常中包含了对用户的提示信息,这种处理方式被称为异常传译(责任链模式应用之一)。

异常处理目标:
1 使程序代码混乱最小化
2 捕捉并保留诊断信息
3 通知合适的人员
4 采用合适的方式结束异常活动

异常处理基本准则:
1 不要过度使用异常(异常处理的初衷是将不可预期的异常处理代码和正常业务代码分离,因此绝不要使用异常处理来代替正常业务逻辑判断)
2 不要使用过于庞大的try块
3 避免使用catch all语句
4 不要忽略捕获到的异常