文档章节

Java异常处理最佳实践

yysue
 yysue
发布于 09/24 03:34
字数 596
阅读 8
收藏 0

总结一些Java异常的处理原则

Java异常处理最佳实践

不要忘记关闭资源

在finally里关闭资源

public void readFile() {
    FileInputStream fileInputStream = null;
    File file = new File("./test.txt");
    try {
        fileInputStream = new FileInputStream(file);
        int length;
        byte[] bytes = new byte[1024];
        while ((length = fileInputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, length));
        }
    } catch (FileNotFoundException e) {
        logger.error("找不到文件", e);
    } catch (IOException e) {
        logger.error("读取文件失败", e);
    } finally {
        if (fileInputStream != null) {
            try {
                fileInputStream.close();
            } catch (IOException e) {
                logger.error("关闭流失败", e);
            }
        }
    }
}

用try-with-resource关闭资源

public void readFile2() {
    File file = new File("./test.txt");
    try(FileInputStream fileInputStream = new FileInputStream(file)) {
        int length;
        byte[] bytes = new byte[1024];
        while ((length = fileInputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, length));
        }
    } catch (FileNotFoundException e) {
        logger.error("找不到文件", e);
    } catch (IOException e) {
        logger.error("读取文件失败", e);
    }
}

使用描述性消息抛出异常

指定具体的异常

  • 用NumberFormatExcepton而不是Exception,这样能更快的定位问题
  • NumberFormatException 是运行时异常
public void numberFormat() {
    try {
        String year = "2018";
        System.out.println(Integer.parseInt(year));
    } catch (NumberFormatException e) { // 捕获NumberFormatExceptoin而不是Exception
        logger.error("年份格式化失败", e); // 描述一下异常
    }
}

给异常加注释

// 自定义一个异常
class NotFoundGirlFriendException extends Exception {
    public NotFoundGirlFriendException(String message) {
        super(message);
    }
}

/**
 *
 * @param input
 * @throws NotFoundGirlFriendException input为空抛出异常
 */
public void doSomething(String input) throws NotFoundGirlFriendException {
    if (input == null) {
        throw new NotFoundGirlFriendException("出错了");
    }
}

优先捕获具体异常

public int getYear(String year) {
    int retYear = -1;
    try {
        retYear = Integer.parseInt(year);
    } catch (NumberFormatException e) {
        logger.error("年份格式化失败", e);
    } catch (IllegalArgumentException e) {
        logger.error("非法参数", e);
    }
    return retYear;
}

不要捕获Throwable

  • Throwable是所有异常和错误的父类,会把error捕获
  • error是那些无法恢复的jvm错误,eg:StackOverflowError和OutOfMemoryError
public void test6() {
    try {
    } catch (Throwable e) {
    }
}

不要忽略异常

public void test7() {
    try {

    } catch (NumberFormatException e) {
        logger.error("即便你认为不可能走到这个异常,也要记录一下", e);
    }
}

捕获和抛出只选择一种

  • 不要同时记录并抛出异常,会导致相同错误日志输出多次
public void foo() {
    try {
        new Long("xyz");
    } catch (NumberFormatException e) {
        logger.error("字符串格式化成Long失败", e);
        throw e;
    }
}

包装异常不要丢弃原始异常

class MyBusinessException extends Exception {
    public MyBusinessException(String message) {
        super(message);
    }
    public MyBusinessException(String message, Throwable cause) {
        super(message, cause);
    }
}

public void wrapException(String id) throws MyBusinessException {
    try {
        System.out.println(Long.parseLong(id));
    } catch(NumberFormatException e) {
        throw new MyBusinessException("ID格式化失败", e);
    }
}

参考

Java 异常处理最佳实践(2018)

© 著作权归作者所有

共有 人打赏支持
yysue
粉丝 27
博文 268
码字总数 155357
作品 0
济南
程序员
私信 提问
Java 编程中关于异常处理的 10 个最佳实践

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

oschina
2013/03/29
14K
26
Java异常处理 10 个最佳实践

异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以try,catch...

Java技术栈
08/27
0
0
Java自定义Exception

这里总结一下Java的Exception,并实现一个自定义Exception类。 总结: Throwable对象分为两种类型:Error(表示编译时和系统错误);Exception(在Java类库、用户方法以及运行时故障中抛出的异常...

Triangle23
2014/12/02
0
1
十个JDBC的最佳实践

JDBC是Java为多种关系型数据库提供的统一的访问接口,以下是我长期使用JDBC总结的十个最佳实践。 JDBC最佳实践1:使用PrearedStatement 任何一个使用过JDBC的Java程序员几乎都知道这个,Pre...

王振威
2012/09/08
6.3K
12
Java的Exception和Error面试题10问10答

在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题。Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它成为面试题中的...

lwei
2013/10/10
18.2K
48

没有更多内容

加载失败,请刷新页面

加载更多

读取zookeeper上的dubbo注册信息

dubbo有自己的服务监听服务器,incubator-dubbo-ops-develop,github可以下载到,网上也有很多本地部署的例子,就想了下能不能自己监听dubbo的服务,于是写了如下代码。特别注意的是zookeep...

noob_chr
18分钟前
0
0
Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 一、...

王磊的博客
37分钟前
1
0
Ext grid 渲染

// 单元格字体颜色渲染function renderer_Meta_useStatus(value, cellmeta, record,rowIndex, columnIndex, store){ var color = ""; if("空闲"==value){ color = "green";......

MoksMo
47分钟前
4
0
log4j2在spring中的配置

<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,这个用于设置l......

TonyTaotao
52分钟前
3
0
java 中间变量缓存机制(i++,++i)

public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); } } 答案是 0 如果是 i = ++......

shzwork
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部