黑马程序员- java-Exception

---------------------- android培训java培训、期待与您交流! ----------------------

  java中的异常就是指在程序运行过程中出现了问题,现实生活中的问题是一个具体的事物,java作为面向对象的语言,则通过类描述问题,把
问题封装成对象。
    异常体系:
       Throwable
           --Error
           --Exception
                 --RuntimeException
  Throwable类是Java语言中所有错误或异常的超类,Error和Exception是他的2个子类。对于Error,是严重的问题,一般不编写针对性的代码对其处理,
对于Exception则可以使用针对性的方式进行处理。 
java可以通过try-catch语句来捕获程序中出现的问题的对象
  try{程序}
  catch{Exception e}
  {
     e.printStackTrace();
  }
  Exception为异常问题被封装的对象的类型,e为一异常对象,内部封装了异常的信息; e.printStackTrace()就是打印出该问题对象中的异常信息。
 
 
如果定义一个方法可能会出现异常,则可通过在方法上加throws来声明异常,在调用该方法的函数中用try-catch捕获
int div(int a,int b) throws Exception
{
     return a/b;
}
当然在声明异常时,建议声明为更具体的异常,这样处理可以更具体:int div(int a,int b) throws ArithmeticException
,也可以声明多个具体的异常int div(int a,int b) throws A,B,C,
具体异常类都为Exception的子类。


对于项目中出现的特有问题,我们可以通过继承Exception类定义自己的异常:
class SelfException extends Exception
{ }

可以通过throw关键字抛出一个自定义的异常对象:
int div(int a,int b)
{
     if(b<0)
       throw new SelfException();
     return a/b;
}
当在方法内部出现了throw抛出的异常对象,要么在方法上声明让调用者处理,要么在内部try-catch处理:

int div(int a,int b) throws SelfException
{
     if(b<0)
       throw new SelfException();
     return a/b;
}
或者int div(int a,int b)
 {
      if(b<0)
   try
   {
    throw new SelfException();
   }
   catch (SelfException e)
   {
    
    e.printStackTrace();
   }
      return a/b;
 }
如果方法上声明了异常,则调用者处理的方法有throws或try 
 
 
因为父类Exception已经把异常信息都操作完成了,所以子类在构造时将异常信息传递给父类通过super语句,
就可以直接通过getMessage方法获取自定义的异常。
class SelfException extends Exception
{
 SelfException(String message)
 {
  super(message);
 }
}

我们自定义的异常继承Exception的原因:
因为异常类和异常对象都被抛出,他们都具备可抛出性,这个可抛性是Throwable这个体系独有的特点,
只有这个体系中的类和对象才可以被throw和throws操作。
throws使用在函数上,throw使用在函数内,throws后面跟的异常类,可以用多个逗号隔开,
throw后面跟的是异常对象。


在异常的子类中,有一个RuntimeException类及其子类,未检查异常类,就是该类在编译过程中不检查,编译可以通过,
如果在方法内抛出该异常,方法上可以不声明,如果在方法上声明了该异常,调用者可以不处理,因为该异常如果发生,
程序会停止,无法继续执行,希望对程序代码进行修正。
当在自定义问题的时候,如果发生的问题自己可以处理,继承Exception;如果问题自己不能处理,则继承RuntimeException


异常处理中,当我们捕获到异常,但本功能处理不了时,可以在catch中继续抛出:
try
{
 throw new AException();
}
catch (AException e)
{
 throw e;
}


异常处理中,如有一个方法run()抛出A异常,有一个对象t他只能处理B异常,所以我们在处理run()方法的时候可以捕获A异常然后
抛出B异常(调用者可以处理的异常)。
class A extends Exception{}
class B extends Exception{}
public class Test2
{

 public void run() throws B
 {
        try
  {
   throw new A();
  }
  catch (A e)
  {
   //处理A异常
   throw new B();
   
  }
 }

 public static void main(String[] args)
 {
  Test2 t = new Test2();
  
  try
  {
   t.run();
  }
  catch (B e)
  {
   
   e.printStackTrace();
  }

 }
}

在异常处理中,还有try-finally块的应用,finally块中存放着一定会被执行的代码,常用于关闭资源,如下
在JDBC中,java与数据库的连接conn资源及st,rs等一定要关闭:
try
{
  建立连接
 conn = DriverManager.getConnection(url,user,password);
  创建语句
 st = conn.createStatement();
  执行结果
 rs = st.executeQuery("select * from user");

}
finally
{
 if(rs!=null)
  rs.close();
 if(st!=null)
  st.close();
 if(conn!=null)
  conn.close();
}
在上面程序中,如果rs.close()处抛出了异常,那么连接conn就没有关闭,程序应改为:
finally
  {
   try
   {
    if (rs != null)
     rs.close();
   }
   finally
   {
    try
    {
     if (st != null)
      st.close();
    }
    finally
    {
     if (conn != null)
      conn.close();
    }
   }
  }
finally块只有一种情况不会执行,当程序执行到System.exit(0); finally不会执行

 

异常在子父类覆盖中的体现:
1,子类在覆盖父类时,如果父类方法抛出异常,则子类的覆盖方法只能抛出父类的异常或者是该异常的子类;
2,如果父类方法抛出多个异常,那么子类在覆盖方法时,只能抛出父类异常的子集;
3,如果父类或者接口的方法中没有抛出异常,则子类的覆盖方法也不可以抛出异常,如果子类方法发生了异常,则必须进行try处理,绝对不能抛。


异常处理补充:当调用到抛出异常的功能时,抛出几个,就处理几个,一个try对应多个catch,
如果多个catch块中的异常出现继承关系,父类的异常catch要放到最下面。
catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,输出语句等。

 

 

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值