其他语言爱好者,如Scala或Clojure总是诋毁事实,说Java太冗长、繁琐。所以,在Java7中引入大量新设施,以帮助并减少应用程序开发者需要编写的代码,并不太另人吃惊。 看看下面这段代码,侧重于catch块的冗余,它们是多么的冗余啊。 以下是引用片段:class OpenException extends Exception {} class CloseException extends Exception {} public class PreciseRethrows……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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搞起了一块主要的企业软件业务。