文档章节

Java异常处理最佳实践

yysue
 yysue
发布于 09/24 03:34
字数 596
阅读 7
收藏 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
粉丝 26
博文 264
码字总数 154329
作品 0
济南
程序员
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
避免 Java 应用中 NullPointerException 的技巧和最佳实践

Java应用中抛出空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。熟话说“预防胜于治疗”,对于这么令人讨厌的空指针异常,这句话也是成立的。值得庆幸的是运用一些防...

大数据之路
2013/11/29
0
1
Spring JDBC最佳实践(1)

Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。 基于Tem...

zuoer
2012/01/04
0
2
Java虚拟机内存管理(一)—内存划分

Java 与 C++ 之间有一堵由内存动态分配和垃圾收集技术所围成的 “高墙”,墙外面的人想进去,墙里面的人却想出来。——《深入理解Java虚拟机:JVM高级特性与最佳时实践(第二版)》周志明 Ja...

Wizey
08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu 安装ssh服务以及开启root用户ssh登录

一、安装ssh服务 安装ssh服务 sudo apt-get update sudo apt-get install openssh-server 安装完成后启动ssh服务 sudo service ssh start 二、开启root用户ssh登录 解决root远程ssh不能登录,...

15834278076
7分钟前
0
0
AndroidRX

1.延时并切换回主线程执行 Observable.just(true).delay(2, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Boolean>() { [@Override](https://my.......

我是菜鸟我骄傲
35分钟前
1
0
申请Let's Encrypt永久免费SSL证书

环境安装 1、安装git yum install git-core 2、安装python 系统自带 不用安装 只要版本大于2.7即可。 获取Let's Encrypt免费SSL证书 先停止nginx 在阿里云安全组里加入 443端口的入规则 git ...

HGMrWang
43分钟前
1
0
如何使用playframework进行更好的开发

1: 自定义基类Controller 相信刚开始使用Play的人写的Controller 都继承于 play.mvc.Controller , 但这并不是一个很好的选择,自建基类Controller可以扩展更多的功能。 1.1 验证功能。 后台...

tuerqidi
48分钟前
6
0
《JavaScript高级程序设计(第3版)》阅读笔记

第6章 面向对象的程序设计 6.2 创建对象 6.2.1 工厂模式 JavaScript创建对象(一)—— 工厂模式 6.2.2 构造函数模式 JavaScript创建对象(二)——构造函数模式 6.2.3 原型模式 JavaScript...

Bob2100
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部