文档章节

Java编程最差实践(二)

六月雨
 六月雨
发布于 2014/09/17 14:25
字数 637
阅读 19
收藏 0


捕获所有的异常

错误的代码:

Query q = ...  
Person p;  
try {  
    p = (Person) q.getSingleResult();  
} catch(Exception e) {  
    p = null;  
}

    这是EJB3的一个查询操作, 可能出现异常的原因是: 结果不唯一; 没有结果; 数据库无法访问, 而捕获所有的异常, 设置为null将掩盖各种异常情况.

正确的写法:

Query q = ...  
Person p;  
try {  
    p = (Person) q.getSingleResult();  
} catch(NoResultException e) {  
    p = null;  
}


忽略所有异常

错误的代码:

try {  
    doStuff();  
} catch(Exception e) {  
    log.fatal("Could not do stuff");  
}  
doMoreStuff();

这个代码有两个问题, 一个是没有告诉调用者, 系统调用出错了. 第二个是日志没有出错原因, 很难跟踪定位问题.

正确的写法:

try {  
    doStuff();  
} catch(Exception e) {  
    throw new MyRuntimeException("Could not do stuff because: "+ e.getMessage, e);  
}


重复包装RuntimeException

错误的代码:

try {  
  doStuff();  
} catch(Exception e) {  
  throw new RuntimeException(e);  
}

正确的写法:

try {  
  doStuff();  
} catch(RuntimeException e) {  
  throw e;  
} catch(Exception e) {  
  throw new RuntimeException(e.getMessage(), e);  
}  
try {  
  doStuff();  
} catch(IOException e) {  
  throw new RuntimeException(e.getMessage(), e);  
} catch(NamingException e) {  
  throw new RuntimeException(e.getMessage(), e);  
}


不正确的传播异常

错误的代码:

try {  
} catch(ParseException e) {  
  throw new RuntimeException();  
  throw new RuntimeException(e.toString());  
  throw new RuntimeException(e.getMessage());  
  throw new RuntimeException(e);  
}

    主要是没有正确的将内部的错误信息传递给调用者. 第一个完全丢掉了内部错误信息, 第二个错误信息依赖toString方法, 如果没有包含最终的嵌套错误信息, 也会出现丢失, 而且可读性差. 第三个稍微好一些, 第四个跟第二个一样.

正确的写法:

try {  
} catch(ParseException e) {  
  throw new RuntimeException(e.getMessage(), e);  
}


用日志记录异常

错误的代码:

try {  
    ...  
} catch(ExceptionA e) {  
    log.error(e.getMessage(), e);  
    throw e;  
} catch(ExceptionB e) {  
    log.error(e.getMessage(), e);  
    throw e;  
}

    一般情况下在日志中记录异常是不必要的, 除非调用方没有记录日志.


异常处理不彻底

错误的代码:

try {  
    is = new FileInputStream(inFile);  
    os = new FileOutputStream(outFile);  
} finally {  
    try {  
        is.close();  
        os.close();  
    } catch(IOException e) {  
        /* we can't do anything */  
    }  
}

    is可能close失败, 导致os没有close

正确的写法:

try {  
    is = new FileInputStream(inFile);  
    os = new FileOutputStream(outFile);  
} finally {  
    try { if (is != null) is.close(); } catch(IOException e) {/* we can't do anything */}  
    try { if (os != null) os.close(); } catch(IOException e) {/* we can't do anything */}  
}


捕获不可能出现的异常

错误的代码:

try {  
  ... do risky stuff ...  
} catch(SomeException e) {  
  // never happens  
}  
... do some more ...

正确的写法:

try {  
  ... do risky stuff ...  
} catch(SomeException e) {  
  // never happens hopefully  
  throw new IllegalStateException(e.getMessage(), e); // crash early, passing all information  
}  
... do some more ...


本文转载自:http://macrochen.iteye.com/blog/1393502

六月雨
粉丝 11
博文 42
码字总数 21953
作品 0
杭州
高级程序员
私信 提问
Java 8里面lambda的最佳实践

Java 8已经推出一段时间了,越来越多开发人员选择升级JDK,这条热门动弹里面看出,JDK7最多,其次是6和8,这是好事! 在8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来了...

OSC闲人
2015/04/30
9.9K
41
java 7 入门书籍

一、Java从入门到精通 《Java从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。 《Java从入门到精通(第3版...

modernizr
2014/05/15
7.6K
9
java程序员不同阶段提升技能应该看哪些书籍

欢迎大家在阅读的过程中转发、评论,需要相关资料可以加小编微信:mipi946获取 一、java入门类   对于零基础的小白,想要成为程序员,从事开发相关的工作,java都是一个不错的选择。在这个...

尚学先生
2018/08/26
0
0
Java 编程中关于异常处理的 10 个最佳实践

异常处理在编写健壮的Java应用的过程中,扮演着一个重要的角色。它并不是应用的功能需求,且需要优雅的处理任何错误情况,例如资源不可用,错误的输入,null输入等等。Java提供几个异常处理功...

oschina
2013/03/29
14.3K
26
给代码减负,会RIA的程序猿你伤不起!

身为一名求学者,不得不说,在漫长的等待中,我终于盼到了RIA的实训课程。 其实起先我并不知道什么是RIA,之所以参与进来是因为之前在中达金桥学过LINUX的同学告诉我,他们现在开办了个新的培...

ZDJQ
2011/07/01
102
0

没有更多内容

加载失败,请刷新页面

加载更多

查看线上日志常用命令

cat 命令(文本输出命令) 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行: 显示file文件里匹配nick那行以及上下5行 cat error.log | grep -C ...

xiaolyuh
26分钟前
3
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
32分钟前
3
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
40分钟前
4
0
flutter 剪切板 复制粘贴

复制粘贴功能 import 'package:flutter/services.dart'; Clipboard.setData(ClipboardData(text:_text));Clipboard.getData;...

zdglf
42分钟前
3
0
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费...

米兜
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部