本帖最后由 wnjok 于 2010-01-02 10:15:39 编辑

解决方案 »

  1.   

    在 java 中与错误、异常处理相关的关键字有:throw,throws,try,catch,finally等,注意 throw 和 throws 的区别。通常情况下,可以被 throw 的 Throwable 被分成三大类:Exception, RuntimeException, Error。Exception需要显式地throws;RuntimeException不需要显式地throws,但在外面也可以捕获如NullPointerException;Error是很严重的错误,一般的程序不会被设计成要捕获这类错误,如 ThreadDeath 错误。你所指的异常处理的策略应该是指设计 public 方法时选择抛出什么类型的异常的策略,这要看你的具体设计情景。
      

  2.   

    catch 是自己处理异常(捕获)
    throws是别人处理异常(抛出)如果是新手,建议先做一些磁盘IO、网络通信、类型转换方面的应用,以了解异常的基本使用技巧。对于异常使用,我认为《Java编程思想》第4版12.13一节中9句话总结得很好。
      

  3.   

    通俗点:
    try catch 是积极处理,也就是你如果catch到异常,你直接处理。
    throw 消极处理,往上层抛,自己不处理。
      

  4.   

       1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
        2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
        3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转移,要么重新抛出新类型的异常。
        4、不要把自己能处理的异常抛给别人。
        5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。
    网上搜到的,LZ看看吧,从整体方面来说我个人感觉这五条说的很不错。
      

  5.   

    大哥,不要上火,请看1楼
    注,请注意我问的问题是:“异常处理的策略,如何选择” 

    客观评价,也不行啊,而且我又没攻击你,看你的心态。
    难道你就是传说中的GCD员,只听好听的?
      

  6.   

    给你推荐一本PDF
      《J2EE项目中的异常处理策略》
         http://d.wanfangdata.com.cn/Periodical_xdjsj-xby200805024.aspx
       
      

  7.   

     1、Throwable
                Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
        两个子类的实例,Error 和 Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。    2、Exception
                Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件,表示程序本身可以处理的异常。    3、Error
                Error 是 Throwable 的子类,表示仅靠程序本身无法恢复的严重错误,用于指示合理的应用程序不应该试图捕获的严重问题。
        在执行该方法期间,无需在方法中通过throws声明可能抛出但没有捕获的 Error 的任何子类,因为Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。    4、RuntimeException
                RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过,这种异常可以通过改进代码实现来避免。    5、ThreadDeath
                调用 Thread 类中带有零参数的 stop 方法时,受害线程将抛出一个 ThreadDeath 实例。
                仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例。如果 ThreadDeath 被一个方法捕获,那么将它重新抛出非常重要,因为这样才能让该线程真正终止。
        如果没有捕获 ThreadDeath,则顶级错误处理程序不会输出消息。
                虽然 ThreadDeath 类是“正常出现”的,但它只能是 Error 的子类而不是 Exception 的子类,因为许多应用程序捕获所有出现的 Exception,然后又将其放弃。            以上是对有关异常API的一个简单介绍,用法都很简单,关键在于理解异常处理的原理,具体用法参看Java API文档。
      

  8.   

    一、内层方法抛出异常,外层方法捕捉并处理异常:   public void methodA (){   try{   // 调用methodB   methodB();   }   catch(ExceptionType et){   // 相应处理措施   }   }   public void methodB throws ExceptionType{   if (condition is true)   {   // 相应处理措施   }   else   {   throw new ExceptionType(argument);   }   }   在这个例子中,方法B的头部中声明了该方法会抛出一个类型为ExceptionType的异常,在方法体中使用throw子句抛出了一个异常,那么该异常被谁捕捉到呢,答案是方法A。因为异常抛出后,JVM会顺着该方法的调用栈一层一层的往上找。因为方法A中有一个catch(ExceptionType et),所以被抛出的异常会被捕捉到并处理。   二、方法中自己捕捉,处理异常:   public methodA() {   try   {   // 可能产生异常的语句   }   catch (ExceptionType et)   {   // 相应的处理   }   }   在这个例子中,方法A使用了try-catch语句块,那么意味着在方法中所产生的ExceptionType类型的异常都会被捕捉到并在方法内处理。   三、内层方法抛出一个异常,但本身又有try-catch   public methodB() throws ExceptionType{   try   {   // 可能产生异常的语句   }   catch (AnotherExceptionType aet)   {   // 相应处理措施   }   }   在这个例子中有两种异常处理情况,抛出异常和捕捉异常,如果在try语句块中产生ExceptionType类型的异常的话,会被抛出。如果产生AnotherExceptionType类型的话,则不会被抛出,因为在方法B的头部中并没有声明会抛出该异常。   四、内层方法抛出一个异常,但本身有try-finally   public methodB() throws ExceptionType{   try   {   // 可能产生异常的语句   }   finally   {   // 一定要执行的语句   }   }   这个例子与上一个例子很像,不同的是没有catch,但增加了finally。它的意思如果方法B中try语句块中如果产生了异常,则抛出由外层方法处理。然后方法B继续执行finally中的语句   下面列举三种错误的异常处理方法:   一、内层方法抛出一个异常,但本身有捕捉这个异常   public methodB() throws ExceptionType{   try   {   // 可能产生异常的语句   }   catch (ExceptionType et)   {   // 相应处理措施   }   }   在这个例子中,方法B在头部声明了会抛出一个类型为ExceptionType的异常,但在紧接下来的方法体又用了catch(ExceptionType et),如果产生了异常的话,会有什么结果呢?方法B抛出的异常马上被自身的catch捕捉到,所以方法头部的throws实际是没有作用的。外层方法是接收不到方法B抛出的异常对象的。   二、在try中使用了return,在fianlly中又使用了return   public methodB() {   try   {   // 可能产生异常的语句   return SOMEVALUE;   }   catch ()   {   }   finally   {   return SOMEVALUE_2;   }   }   在这个例证中,我们可以看到在try中返回了SOMEVALUE,那么程序执行到这里是否就结束了呢,其实不是的,因为finally中的语句是肯定会被执行到的,所以最后返回的是SOMEVALUE_2;那么意味者即使程序没有抛出异常,最后也得不到正确的结果。   三、把catch(Exception e)放在所有catch块的最前面   public methodB(){   try   {   }   catch (Exception e)   {   ...   }   catch (SubException se)   {   ...   }   }   在这个例子中,catch(Exception e)被放在所有catch语句块的最前面,因为Exception所有Exception类型的父类,所以意味着所有在try中产生的异常都会被捕捉到。后面其他的catch都是没有用的,所以一定要把catch(Exception e)放在最后面,如果前面所有的异常类型都不符合,至少保证还有一个可以处理它。 
      

  9.   

      抱歉我没注意看。。
       下面是网友摘得一部分
         http://www.360doc.com/content/06/0808/09/10273_176221.shtml
      

  10.   

    选择是痛苦的;用eclipse你就解脱了
      

  11.   

    最好是一层一层往外抛,到了Action层,自己就写一个异常处理类,处理掉这个异常,并以友好的页面,呈现给前台,让访问者知道发了什么事。
      

  12.   

    你这个问题很大啊....  如果你关于"异常"的基本知识知道的话, 异常的处理问题"该 Catch 还是该 Throw" 
    不是一句话说得清的啊; 例如: 如果一个程序启动时需要进行配置文件读取, 而读取配置文件的代码无法找到需要读取的文件,即
    抛  FileNotFoundException ,这个时候你认为"该 Catch 还是该 Throw"??? 
    这个时候(我认为)应该 Catch 然后就让程序终止;例如: 你写了一个工具类, 如果工具类中的方法抛出异常,你"该 Catch 还是该 Throw", 这个时候你应该
    想到工具类仅仅是一个工具, 只做事, 做事情出错了不应该他管(我认为), 此时你就应该将这个异常抛出去,
    抛给使用这个工具的类, 让他去决定如何处理;"该 Catch 还是该 Throw" 不是简单两句话就能说清楚的, 不然也不会有那有 第13楼的朋友介绍的那一类
    书了;