public class TestException{
  public void get(String str)throws ClassNotFoundException
  {
     try{
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     }catch(ClassNotFoundException e){
         e.printStackTrace();
         throw new ClassNotFoundException(); //这句
     }
  }
  public void get1(String str)throws ClassNotFoundException
  {
    try{
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }catch(ClassNotFoundException e){
        e.printStackTrace();   
    }
  }
  public void get2(String str)throws ClassNotFoundException
  {
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  }
  public void get3(String str)
  {
     try{
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     }catch(ClassNotFoundException e){
       e.printStackTrace();
     }
  }
}最好能详细解释try{}catch(){}、throws和throw的区别,以及什么时候分别该用他们,还有他们该如何配合使用????·!···

解决方案 »

  1.   

    简单说一下,肯定没有书上说得详细 
      JAVA的异常处理是由五个关键字来管理的,TRY,CATCH,THROW,THROWS和FINALLY
      如果TRY代码块中有异常发生,则可以使用CATCH捕获这个异常,并且转而执行CATCH代码块中的东西.系统产生的异常由JAVA运行时候自动抛出,我们也可以使用THROW手动抛出异常.比如你这里的throw new ClassNotFoundException(); //这句
      如果一个方法产生自己不处理的异常,则需要使用THROWS子句声明该异常
      而FINALLY中的语句是不论程序是否有异常都将执行的.比如你进行数据库操作,不论成功与否你都想最后断开连接,你就可以把断开的语句写到FINALLY代码块里.
      

  2.   

    throws 用来声明方法可能会抛出的异常,这样定义的方法头反映了该方法会抛出哪些"已检查的异常)
    throw 用来抛出异常
    如果在方法内部抛出了异常(或者在方法内部调用的其他方法抛出了异常),这个方法将在抛出异常的过程中结束.要是不希望方法就此结束,可以在方法内设置一个特殊的快来捕获异常.因为在这个快尝试各种可能产生异常的方法调用,所以称为"try"块.
    抛出的异常必须在某处得到处理.这个"地点"就是"异常处理程序",而且针对每个要捕获的异常,得准备相应的处理程序,这个就是"catch"块.
    以上出自thinking in java 3rd
    get方法调用Class.forName就有可能产生"ClassNotFoundException",然后被后面的catch块所捕获,然后把异常信息打印出来,最后在重新把异常抛出(这可以在以后调用get方法时再重新处理这个异常)
    get1方法只是把异常捕获,然后打印异常信息
    get2方法只是方法头声明了可能throws ClassNotFoundException,但并没有真正的抛出异常,也没有处理它,如果要调用get2方法,就必须把它放在try块然后对可能抛出的异常进行处理.
      

  3.   

    public class TestException{
      public void get(String str)throws ClassNotFoundException
      {
         try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         }catch(ClassNotFoundException e){
             e.printStackTrace();
             //throw new ClassNotFoundException(); 
             //--使用新的异常通常用于更精确的提示问题, 上句可改为 
             throw new ClassNotFoundException("找不到指定类",e); 
         }
      }
      public void get1(String str)throws ClassNotFoundException
      {
        try{
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();   
            //这样不会因为找不到类而抛出异常, 应用上认为通过上句提示就可以了, 写法上get3更合适
        }
      }
      public void get2(String str)throws ClassNotFoundException
      {
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           //和get()方法的效果一样的, 在这个层次不处理异常,而由上级调用者处理
      }
      public void get3(String str)
      {
         try{
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         }catch(ClassNotFoundException e){
           e.printStackTrace();
         }
      }
    }===================
    一般常用
    a() throws Exception1, Exception2, ...{  //抛出由调用层处理的异常
    try{
      //遇到逻辑错误, 抛出异常, 说明问题出在哪
      throw new ...
    }catch(... e){
      //抓住已知错误, 并根据需要由程序处理
      ...
      //也可继续抛出
      throw e;
      //也可形成更明确的异常
      throw new ...
    }finally{
      //不管是否出现异常都要处理的模块, 如关闭stream, 关闭数据库连接等
    }
    }
      

  4.   

    一般常用
    a() throws Exception1, Exception2, ...{  //抛出由调用层处理的异常
    try{
      //遇到逻辑错误, 抛出异常, 说明问题出在哪
      throw new ...
    }catch(... e){
      //抓住已知错误, 并根据需要由程序处理
      ...
      //也可继续抛出
      throw e;
      //也可形成更明确的异常
      throw new ...
    }finally{
      //不管是否出现异常都要处理的模块, 如关闭stream, 关闭数据库连接等
    }
    }
      

  5.   

    try {
        小张.请客(小王);
        两个人吃得饱饱的;
    } catch (小王有急事) {
        小张省下一个人的饭钱;
    }
    小张手上还剩若干钱;
      

  6.   

    YidingHe(机枪兵)  beautiful example