Java SE 7 异常处理

Java SE 7 在日常编程中对一些内容进行了优化

具体有以下几种

1、switch 语句中支持字符串String

如:switch(“a")

2、更好的整型字符串

3、泛型改进类型推断<>

4、优化了异常处理

5、简化了可变参数方法调用

我这次主要说的是优化的异常处理具体内容是:多重捕获、重新抛异常和try -with -resources。

1、多重捕获异常

JAVA SE7中新增了多重捕获异常,以便更轻松更简洁的处理异常。以后淘宝线上服务器都切换到JAVA 7的时候,我们新代码就可以使用这种特性了。

现在我们写一段代码进行多重捕获异常是这样的

示例1

public class Test1 {

publicstaticvoid
main(String[] args) {

try{

XXX()xx =
newXXXX();


xx
.xxx();

}catch(ParseException
exception){

}catch(IOException
exception){

}catch(ProduceExceptionexception){

}

}

}

比如我们这三个异常中,ParseException异常和IOException的业务处理是一致的情况下,要么拷贝同样的代码一份写在一个异常中,要么就使用不同的业务逻辑。如果是在偷懒或者不考虑资源消耗的情况下直接使用

class Test2 {

publicstaticvoid
main(String[] args) {

try{

XXX()xx =
newXXXX();

xx.xxx();

}catch(Exception exception){

}

}

}

那么在Test2这个类中,存在的最大问题就是try代码块中的任何代码都会出现异常,而该异常将被一个覆盖式的catch Exception 子句吞掉了。如果抛出的异常不是ParseException异常和IOException,而是其他的异常,在Test2中仍然会捕获它,而上游调用代码不知道实际发生了什么。而这种异常吞并会很难对问题进行处理活着调试(如果业务不确定异常或者异常可以统一处理时,可以直接使用的)

那么在JAVA 7中,就允许开发者将catch子句组合在一起,而无需在让存在一致的异常处理进行copy了。

class Test3 {

publicstaticvoid
main(String[] args) {

try{

XXX()xx =
newXXXX();

xx.xxx();

}catch(ParseException
| IOException exception)
{

}

}

}

Test3类中显示的将两条语句合并成一个catch块,那么在catch时将同时捕获这两种异常;因此,如果业务出现两种异常使用同一处理时就可以使用此方法了。

语法时:ParseException | IOException exception

2、重新抛出异常

在执行异常处理时,有时会重新抛出已经处理过的异常或者当前不处理这个异常直接抛出。通常在偷懒或者经验不足的时候会这么写

class Test4 {

publicstaticvoid
main(String[] args) {

try{

createTest();

}catch(IOException
exception){

System.err.println(exception.getMessage());

}

}

publicstaticvoid
createTest() throws Exception{

try{

Test4
test =
new Test4();

test.notifyAll();

}catch(Exception
e){

throw e;

}

}

}

在执行Test4是无法编译的

class Test5 {

publicstaticvoid
main(String[] args) {

try{

createTest();

}catch(RuntimeException
exception){

System.err.println(exception.getCause().getMessage());

}

}

publicstaticvoid
createTest() throws Exception{

try{

thrownew
IOException("Error");

}catch(IOException
e){

thrownew
RuntimeException(exception);

}

}

}

Test5中显示了一种处理异常然后将其重新抛出的方法,当然在Test5中也是有问题的,是没有把最原始的异常抛出来,而是嵌套在另一个异常中,这意味着下游调用或者依赖方在使用该方法时需要知道原始异常被嵌套的。

所以这样处理也是不够友好的。如果要给调用方原始异常,那么就需要做一下改动,看下面的例子:

class Test6 {

publicstaticvoid
main(String[] args) {

try{

createTest();

}catch(IOException
exception){

System.err.println(exception.getCause().getMessage());

}

}

publicstaticvoid
createTest() throws Exception{

try{

thrownew
IOException("Error");

}catch(IOException
e){

thrownew
RuntimeException(exception);

}

}

}

3、Try-with-Resources

在使用异常处理时,经常会发现一个问题,就是对资源关闭的时候,如jdbc需要关闭Connection链接;

如例子(这个代码是我用来给测试做批量的报名数据时使用的)

public class Test {

publicstaticvoid
main(String[] args) {

Connection
conn =
null;

String sql;

String url =
"jdbc:mysql://XXXXX:XXXXX/XXXXX?" +
"user=root&password=root&useUnicode=true&characterEncoding=GBK";

try {

Class.forName("com.mysql.jdbc.Driver");//

conn = DriverManager.getConnection(url,"XXXX","XXXX");

Statement stmt =
conn.createStatement();

for(inti=0;i<10000;i++){

sql =
"INSERT INTO bop_libra_00.bm_application_0093 "

+ "(application_id) "

+ "VALUES "

+ "(10228"+i+"0605)";

intresult
= stmt.executeUpdate(sql);

System.out.println(result);

}

} catch (SQLException
e) {

e.printStackTrace();

} catch (ClassNotFoundException
e) {

e.printStackTrace();

}
finally {

try {

conn.close();

}
catch (SQLException
e) {

//
TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

在上面的代码中,是JAVA SE 7之前的处理关闭资源的一种方式。

大家看到这里也注意到了一个问题,那就是conn在关闭的时候其实是在try catch外在加了一层处理逻辑,如果我们只想做之事在发送SQLException时对conn进行关闭呢?那么是不是需要写很多的逻辑代码?

那么在JAVA SE 7的时候我们该怎么做呢?是可以更简洁的完成,可以使用JAVA SE 7中新的语法,可以声明作为try块的组成部分的资源。这样其实也意味着预先考虑到资源的消耗,在程序运行时将在执行try 代码块后自动关闭资源,前提是如果尚未关闭等。

public class Test1 {

publicstaticvoid
main(String[] args) {

Connection
conn =
null;

String sql;

String url =
"jdbc:mysql://XXXXX:XXXXX/XXXXX?" +
"user=root&password=root&useUnicode=true&characterEncoding=GBK";

try(conn = DriverManager.getConnection(url,"XXXX","XXXX")){

Class.forName("com.mysql.jdbc.Driver");//

Statement stmt =
conn.createStatement();

for(inti=0;i<10000;i++){

sql =
"INSERT INTO bop_libra_00.bm_application_0093 "

+ "(application_id) "

+ "VALUES "

+ "(10228"+i+"0605)";

intresult
= stmt.executeUpdate(sql);

System.out.println(result);

}

} catch(SQLException | ClassNotFoundException
e) {

e.printStackTrace();

}

}

}

Test1类的实际的打开操作是发生在try (….) 语句中。当然实现这个代码的前提是需要实现AutoCloseable接口才可以

总结

JAVA SE 7中的异常处理更改不仅可以使开发的代码更简洁,还允许对部分异常进行预处理,然后再出现异常的时候进行调用。还能使得在异常清理操作时减少再次异常的出现,新的异常处理可以使得开发人员的效率提高和避免一些特殊的业务处理

时间: 2025-01-30 06:51:40

Java SE 7 异常处理的相关文章

黑马程序员 Java SE回顾

----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java SE基础回顾 1.循环语句中的break是终止全部循环,跳出循环体:而continue是终止本次循环,跳执行下一循环 2.return语句有两个作用:返回值:结束方法的运行 3.对于java中面向对象的理解:以类的方式组织代码,以对

Java SE知识点划分

Java SE知识点划分 1.程序设计基础:所有编程语言的基础(变量.数组.选择.循环等基本结构) 2.面向对象初识:理解类和对象,java中一切以类的设计为主 3.面向对象深入:三大特性(封装.继承.多态)其实接口相当的重要我更愿意把接口当作java的一大特性 4.常用类库:最典型的就是String类(学会如何使用这些已经封装好了的类,可以提高开发和工作效率) 5.异常处理.泛型:比较简单,开发中使用的用的也挺多的 6.多线程和网络编程:普通开发中用的并不是很多,但是如果涉及到即时通讯之类的就

Java SE应用程序设计视频教程相关de介绍

Java SE应用程序设计视频教程的内容由浅入深,包括Java程序设计基础.面向对象程序设计.接口.内部类.异常处理.断言.集合框架等基础知识.如果您有意学习这方面知识,参考这部教程学习绝对错不了. Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的

Java SE 6 新特性: Java DB 和 JDBC 4.0

http://www.ibm.com/developerworks/cn/java/j-lo-jse65/index.html 长久以来,由于大量(甚至几乎所有)的 Java 应用都依赖于数据库,如何使用 Java 语言高效.可靠.简洁地访问数据库一直是程序员们津津乐道的话题.新发布的 Java SE 6 也在这方面更上层楼,为编程人员提供了许多好用的新特性.其中最显著的,莫过于 Java SE 6 拥有了一个内嵌的 100% 用 Java 语言编写的数据库系统.并且,Java 6 开始支持 J

安卓里面JSON处理和JAVA SE里面的JSON包

今天编译安卓项目遇到这个问题 com.android.dex.DexException: Multiple dex files define的解决办法 大致意思就是引用了 相同的包 在JAVA SE里面我使用的是 import net.sf.json.JSONObject; 这个就不多说了,网上大家都可以下载到,但是当吧这个jar放到安卓里就出现引用相同的包的问题了 看了下android.jar 里面有个org.json 一样可以处理 问题解决

org.apache.catalina.connector.Request.parseParameters(Request.java:2446) NullPointerException异常处理

1.环境 tomcat6.0.8 + jdk6 + struts1 2.问题的产生 页面有两个异常的请求 http://127.0.0.1/project/a.action?do=testA&m=10 http://127.0.0.1/project/a.action?do=testB&m=10 两个请求几乎同步到达server.结果出现异常: java.lang.NullPointerException at org.apache.catalina.connector.Request.p

java书籍推荐:《Java SE 6 技術手册》

Java SE 6 技術手册 或  Java SE 6 技術手册 Java SE 6 技術手册 為什麼選擇用 Markdown?仅仅是單純把文件又一次排版太無聊了,不如趁這個機會學些新東西.所以我就藉這個機會來學著用 Markdown,並看看它有什麼好處與壞處 ... 假设你须要 PDF 與 epub 格式.而又有點懶自己轉換,那麼能够考慮在 Google Play 或 Pubu 上向便當價致敬,假设你须要 mobi 格式,能够使用 calibre 把 epub 轉為 mobi ... :) 我

【Java SE】如何用Java实现直接选择排序

摘要:直接选择排序属于选择排序的一种,但是它的排序算法比冒泡排序的速度要快一些,由于它的算法比较简单,所以也比较适合初学者学习掌握. 适宜人群:有一定Java SE基础,明白Java的数据类型,数组的定义.初始化以及常用数组的方法,还有Java的循环操作. 前期准备:最好有一个开发工具比如说:eclipse或者myeclipse都可以,当然你使用DOS系统进行编译运行都可以,只不过改bug会麻烦一点. 排序原理:直接选择排序的原理是将指定排序位置与其他数组元分别对比,如果满足条件就交换位置的值,

Java SE 基础:标识(zh&#236;)符

Java SE 基础:标识(zhì)符 一.标识符定义 标识符,就是给类.接口.方法.变量等起名字时的字符序列 二.组成规则与注意事项 1.组成规则 英文大小写字母 数组 $ 和 _ 2.注意事项 不能以数组开头 不能是 Java 关键字(见关键字表:) 书写时区分大小写(大写和小写表示两个不同的标识符,如 public 和 Public 是不同的) 三.Java 中标识符的命名规则要做到:见名知意 包(package):包其实就是文件夹,用于区分项目中文件的结构,包名应当使用小写 单级包:to