`

Java异常那些不得不说的事

    博客分类:
  • Java
阅读更多

一、在finally块中做数据回收操作

比如数据库连接都是很宝贵的,所以最好在finally中关闭连接。

JDBCAgent jdbc = new JDBCAgent();
try{
jdbc.excute("select * from ctp_log");
}catch(SQLException e){
...
}finally{
jdbc.close();
}

 

 

二、不要在异常finally块中定义返回值

如下代码,虽然有很多返回值,但如果真的执行,该代码的返回值永远是3,因为finally是最终执行代码,将其它返回值全部覆盖了!

try{  
  if(x = 1){  
    return throw new RuntimeException();  
  }else{  
    return 1;  
  }  
}catch(Exception e){  
  return 2;  
}finally{  
  return 3;  
} 

 

 

三、覆写Exception的fillInStackTrace方法能提高异常性能

异常性能差是因为fillInStackTrace方法,该方法是带锁的并且需要填充线程异常栈信息。

而我们的业务类异常是不需要记录异常栈的,可以考虑覆写fillInStackTrace方法减小性能开支(据说覆写该方法能提高10倍性能)。

(注:什么是业务类,参照第四点)

public class AccountException extends Exception {
    public Throwable fillInStackTrace() {  
        return this;  
    }
}

 

 

四、业务上的错误使用异常更加OOP

以登录为例,简单的登录方法通过返回boolean即可确认是否登录成功,但如果功能日趋复杂怎么办?通过抛出业务类异常的方式来解析错误信息可读性非常好。

try{
  userManager.login(account,passowrd,identify);
}catch(AccountException e){  
  //账号出错  
}catch(PasswordException e){  
  //密码出错  
}catch(IdentifyException e){
  //验证码错误
}catch(AccountDisableException e){
  //账号被禁用
}

 

 

五、使用正确的log记录异常信息

Log logger = LogFactory.getLog(Demo.class);
try{
  
}catch(SQLException e){
 throw new BusinessException(e);           //√发生该异常会影响后续数据完整性的时候,应该抛出中止操作
 logger.error(e.getLocalizedMessage(),e);  //√记录完整的log日志方便调试
 log.error(e);                             //×这种记录方式只能记录很少的异常信息(连异常发生的位置都没有,记了白记)
 e.printStackTrace();                      //×仅仅将异常打到控制台,开发调试还可以,一旦到生产环境就很难跟踪异常
 System.out.print(e);                      //×同上
}

 

 

六、除了记录异常,记得记录详细参数信息

很多时候通过logger.error(e.getLocalizedMessage(),e)这种记录日志的方式都不一定分析出异常原因。

比如出现一个SQL异常,log日志可能会这样提示:ORA-00936: 缺少表达式。试问这样的错误你能分析这句SQL到底哪儿出了问题吗?不能!所以记录日志的时候最好是把SQL及参数都打印出来,如下例所示。

但记录日志要有分寸,别把客户的机密信息记录出来,如果被发现,我们会负责的!

public List find(Long id,String name){
  String sql = ......;
  try{
  JdbcAgent.excute(sql);
  }catch(Exception e){
  logger.error("sql异常:"+sql+" 参数ID:"+id+",参数name:"+name,e);
  }
}

 

(注:作为研发你可能会说:我通过Eclipse debugger调试就可以知道原因了。但从长远考虑:假如系统已经部署到客户环境上,他们允许你debugger调试吗?不能!所以最好的求助工具就是详细的log日志!)

 

七、从子到父顺序捕获异常

如下所示,假如抛出的是BusinessException异常,那么第二个catch就能捕获到。

如果catch(Exception e)在catch(BusinessException e)之前,则该异常会被catch(Exception e)捕获而不会进catch(BusinessException e)。

try{

}catch(RuntimeException e){

}catch(BusinessException e){//BusinessException extends Exception

}catch(Exception e){

}

 

 

八、使用isInfoEnabled和isDebugEnabled

在看spring和apache等开源体系下的代码时,你会发现在记录log日志时总是看到如下风格的代码:

if (logger.isDebugEnabled()) {
    logger.debug("Published root WebApplicationContext as ServletContext attribute with name [" +WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
}
if (logger.isInfoEnabled()) {
	long elapsedTime = System.currentTimeMillis() - startTime;
	logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");
}

 

为什么记录debug和info日志前要加个判断?其实原因很简单:提高效率!如上代码所示,在记录日志时进行了字符串拼接,要知道这是会消耗一定资源的。假如当前log日志级别是error,则debug和info是不会被输出的,如果加了if判断则log.debug/info中的字符串拼接就不会执行,自然提高了效率。

在小系统看不出差距,但如果是高并发的系统下,少执行一句代码能明显减小服务器的压力,精细化的代码是有必要的!

 

注意:下面这样的代码是提高不了性能的,因为在if之前就已经准备好log信息:

long elapsedTime = System.currentTimeMillis() - startTime;
String info = "Root WebApplicationContext: initialization completed in " + elapsedTime + " ms";
if (logger.isInfoEnabled()) {
	logger.info(info);
}

 

4
0
分享到:
评论

相关推荐

    java异常处理习题

    * `Exception` 是可以被捕捉的异常,而 `Error` 是不能被捕捉的严重错误。 四、异常处理的出口 * 异常处理的出口是 `catch` 子句或 `finally` 子句。 五、多重捕捉异常 * 可以使用多个 `catch` 子句来捕捉不同的...

    java异常机制小结

    同时,通过获取 Java 异常信息,也为程序的开发维护提供了方便,一般通过异常信息就很快就能找到出现异常的问题(代码)所在。Java 异常处理是 Java 语言的一大特色,也是个难点,掌握异常处理可以让写的代码更健壮...

    java异常 异常的概念 应用

    Java异常处理是编程中至关重要的一个环节,它关乎程序的健壮性和稳定性。在Java中,异常(Exception)被用来表示程序运行时发生的错误或不正常情况。异常并不等同于错误,它是程序设计的一部分,允许我们优雅地处理...

    java学习之Java异常.ppt

    Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误情况时能够优雅地进行错误恢复或者至少提供有用的错误信息。Java异常是程序在运行时遇到的问题,例如数组越界、空指针异常、文件未找到等,这些问题...

    Java异常处理体系

    这个主题,"Java异常处理体系",涉及到Java如何优雅地处理程序运行时的异常,确保程序的健壮性和稳定性。这篇博文链接(已提供但无法直接访问)可能详细解释了Java异常处理的基本概念、机制以及最佳实践。 Java异常...

    java异常体系结构

    Java异常体系结构是Java语言的重要组成部分,它负责处理程序执行过程中出现的错误情况。在Java中,异常由Throwable类及其子类构成。Throwable是所有异常的顶层父类,它有两个直接子类:Error和Exception。Error类...

    java异常处理ppt

    5. **自定义异常**:当标准的异常类不能满足需求时,程序员可以创建自己的异常类。这通常通过继承`Exception`类或直接继承`Throwable`类实现。自定义异常有助于提供更精确的错误信息,增强代码的可读性和可维护性。 ...

    C++ Java异常处理比较

    总的来说,C++和Java的异常处理机制各有优缺点。Java更适合大型项目,其严格的异常处理有助于保证代码质量,而C++的灵活性则适合需要精细控制的场景。开发者应根据项目需求和团队习惯选择合适的语言,并充分理解其...

    Java异常处理总结

    ### Java异常处理总结 #### 一、Java异常的基础知识 在Java编程中,异常处理是一项极其重要的技术。异常处理能够帮助开发者优雅地处理程序运行时遇到的问题,避免程序崩溃,并提供给用户友好的反馈信息。 **什么...

    Java异常处理,非常适合Java爱好者

    了解并熟练掌握Java异常处理对于任何Java开发者来说都是至关重要的。 首先,我们要明白Java中的异常类层次结构,它基于`java.lang.Throwable`类,包括`Exception`和`Error`两大类。`Exception`是程序可以预见并可能...

    java 异常处理 代码实例

    Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误时能够优雅地运行,而不是突然崩溃。本篇文章将深入探讨Java异常处理的概念、机制以及如何通过代码实例进行有效的异常管理。 Java异常处理的核心...

    java异常 各种异常

    根据给定文件的信息,我们可以提炼出关于Java异常处理的一些关键知识点。尽管提供的内容与异常处理直接相关的部分较少,但基于标题、描述以及部分上下文,我们可以深入...希望以上内容能对理解Java异常处理提供帮助。

    java高端技术课程--Java异常处理详解

    通过深入学习这个“java高端技术课程--Java异常处理详解”,开发者不仅可以掌握如何有效地处理程序中的异常,还能学习如何设计更稳定、更具弹性的代码。同时,了解和实践良好的异常处理策略也是成为一名优秀的Java...

    JAVA 异常处理的学习

    如果一个`catch`块不能捕获所有可能的异常,可以使用`catch`块链。此外,`catch`可以捕获多个类型的异常,只要它们之间有继承关系: ```java try { // 代码 } catch (IOException | SQLException e) { // 处理这两...

    浅析JAVA异常处理机制.pdf

    ### 浅析JAVA异常处理机制 #### 一、Java异常处理机制概述 异常处理是Java语言中的一个重要机制,它能够确保程序在遇到不可预料的情况时仍能维持稳定运行。异常处理主要包括三个方面:捕获异常、控制程序流程以及...

    Java异常处理终结篇——如何进行Java异常处理设计 - 望远的个人页面 - 开源中国社区1

    9. **使用throws声明**:如果一个方法不能处理某个异常,应该在方法签名中声明该异常,让调用者决定如何处理。 10. **异常传播**:如果一个方法无法处理异常,但知道上层调用者可能能够处理,可以选择不捕获异常并...

    java异常类:java异常

    Java异常处理是编程中至关重要...总的来说,Java异常处理是程序异常情况的管理工具,理解并熟练运用它能帮助我们编写更加健壮和易于维护的代码。通过学习和实践,我们可以更好地应对各种运行时问题,提高程序的鲁棒性。

    Java异常处理

    ### Java异常处理 #### 一、异常的基本概念 在编程领域中,异常是指程序在运行过程中遇到的问题或错误状态,这些问题通常会导致程序无法按照预期的方式继续执行。在Java语言中,异常处理是一种重要的机制,用于...

    java常见异常总结

    为了更好地理解和处理这些异常,本文将详细介绍几种常见的Java异常类型及其处理方法。 #### 1. `java.lang.NullPointerException` - **异常概述**:`NullPointerException`是Java中最常见的运行时异常之一,它发生...

Global site tag (gtag.js) - Google Analytics