Java 7特性:如何在项目Coin中更精确的重新抛出异常

日期: 2012-01-30 作者:Cameron McKenzie and Sal Pece翻译:刘志超 来源:TechTarget中国 英文

其他语言爱好者,如Scala或Clojure总是诋毁事实,说Java太冗长、繁琐。所以,在Java7中引入大量新设施,以帮助并减少应用程序开发者需要编写的代码,并不太另人吃惊。   看看下面这段代码,侧重于catch块的冗余,它们是多么的冗余啊。 以下是引用片段:class OpenException extends Exception {} class CloseException extends Exception {}   public class PreciseRethrows……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

其他语言爱好者,如Scala或Clojure总是诋毁事实,说Java太冗长、繁琐。所以,在Java7中引入大量新设施,以帮助并减少应用程序开发者需要编写的代码,并不太另人吃惊。

  看看下面这段代码,侧重于catch块的冗余,它们是多么的冗余啊。

以下是引用片段:
class OpenException extends Exception {}
class CloseException extends Exception {}
 
public class PreciseRethrows {
     
    public static void main(String args[]) throws OpenException, CloseException {
        boolean flag = true;
        try {
            if (flag){
                throw new OpenException();
            }
            else {
                throw new CloseException();
            }
        } catch(OpenException oe) {
            System.out.println(oe.getMessage());
            throw oe;
        }
        catch (CloseException ce) {
            System.out.println(ce.getMessage());
            throw ce;
        }
    }
}

  这只是一个例子,处理了两个异常,大部分情况下,每一个异常都是用这种方式处理的,记录相关的错误信息到控制台,异常随后被重新抛出。这两个catch块的代码另人十分讨厌,试想一下,如果有五或十个呢?这当然可以理解为,其他语言开发者如何窥视Java冗余异常处理,并且不以为然。

  Java 7之前的版本,一种方法是简单的捕获通用的异常,你可以在下面的代码片段中看到。这有益于消除重复的代码,但是,缺点是该方法本身不在抛出特定的公有或者私有异常,而不是通用的异常。代码的冗余是减少了,但是,客户端应用程序不在容易处理抛出特定的公有或者私有异常。

以下是引用片段:
public static void main(String args[]) throws Exception {
    boolean flag = true;
    try {
        if (flag){
            throw new OpenException();
        }
        else {
            throw new CloseException();
        }
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
        throw e;
    } 
}

  处理损失精度方面的缺陷,声明方法可能抛出的各种异常,Java 7中允许在方法签名中列出更具体、更精确的异常。

  例如,在Java 6中,下列代码片段会出现编译错误:Unhandled exception type Exception

  Eclipse集成开发环境会提供这样的建议:"Add throws Declaration."

以下是引用片段:
public static void main(String args[]) throws OpenException, CloseException {
    boolean flag = true;
    try {
        if (flag){
            throw new OpenException();
        }
        else {
            throw new CloseException();
        }
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
        throw e;
    } 
}

  这里的问题是,方法可以捕获通用的java.lang.Exception异常,但是,意味着它只是抛出了非常具体的公有或私有异常。在Java 6中,你需要添加java.lang.Exception异常和方法签名,但是,在Java 7你不需要做这些。

  你需要避免的一件事情是在catch块中重新分配异常:如果你这样做,好处是,Java 7精确的抛出异常,你要像这样做:

以下是引用片段:
catch (Exception e) {
    System.out.println(e.getMessage());
    e = new OpenException();
    throw e;
}

  你会得到这样一个错误:Unhandled exception type Exception。最简单的摆脱此异常的方法是,在方法中抛出另一个异常java.lang.Exception, 这正是我们首先要避免的事情。

以下是引用片段:
public static void main(String args[]) throws OpenException, CloseException, Exception

  基本上,你可以在方法的throws句子中列出通用的异常,即使他们没有明确的处理某个异常块,如果:

  try块在某个时间点抛出特定的异常。

  前面的catch块尚未处理任何特定的异常。

  在方法签名的throws句子中命名异常必须在类的层次结构中至少处理一次,并重新被catch块捕获(子类或者超类)

  在Java 7中,编译器会查看方法,找出最可能会抛出的异常,而不是简单地找到最常用的异常。Java 7编译器允许你列出方法可能抛出专门的异常,在这种情况下,我们的方法,只有从catch块中不断的抛出通用的java.lang.Exception异常,允许在方法的签名中列出具体的公开或私有异常,事实上,在catch块中抛出很一般的异常,Java 7虚拟机也要识别它,在现实中,这个异常必须是公开或私有异常的实例。

相关推荐

  • Java 7和错综复杂的安全和非安全类型转换

    类型转换的问题之一就是有可能导致精度缺失,尤其是如果要进行转换的数字实际上超出了目标类型的范围。请看下面的代码……

  • Java 7:Switch和OCP认证

    首先,我讨厌switch声明。这真是个要命的程序,我经常看到初级程序员围着一个switch声明忙乎,我一直坚信存在更为面向对象的方法来处理这个问题。

  • JRuby和Java 7 我们可以期待什么

    Java 7已经粉墨登场了,这次带来的新功能感觉有些普普通通,当然还是有几个重要改进。那么对于在Java 7上运行的JRuby,我们能够期待些什么呢?

  • 红帽中间件鲜为人知的另一面

    红帽公司的副总裁兼中间件事业部总经理Craig Muzilla是个大忙人。尽管红帽以Linux发行版名扬天下,但该公司依托JBoss搞起了一块主要的企业软件业务。