译文《最常见的10种Java异常问题》

封面:洛小汐

译者:潘潘

译文《最常见的10种Java异常问题》

译文《最常见的10种Java异常问题》

知彼知己,方能百战不殆。

译文《最常见的10种Java异常问题》

; 前言

本文总结了有关Java异常的十大常见问题。

目录

  1. 检查型异常(checked) vs. 非检查型异常(Unchecked)
  2. 异常管理的最佳实践箴言
  3. 为什么在try代码块中声明的变量不能在catch或者finally中被引用?
  4. 为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?
  5. Java中经常使用的运行时异常
  6. 我们可以在同一个catch子句中捕获多个异常吗?
  7. 在 Java 中构造方法能抛出异常吗?
  8. 在 final 代码块中抛出异常
  9. try语句有return那么finally还会执行吗?
  10. 为何有些开发人员对异常置之不理?

译文《最常见的10种Java异常问题》
; 检查型异常(checked) vs. 非检查型异常(Unchecked)

简单来说,对于检查型异常, 一般在 编译期 就会被检查到,所以我们肯定会提前在方法内进行捕获处理,或者在方法头部申明并抛出。而非检查型异常,往往无法提前预知,例如被除数是0、空指针等。检查型异常特别重要,它会告诉那些调用你的接口的开发者们,如何提前预知并处理好这些可能发生的异常。

例如,IOException就是常见的检查型异常,而 RuntimeException(运行时异常)就是非检查型异常。在阅读剩余部分之前你或许可以研读这份 Java异常的层次结构图

译文《最常见的10种Java异常问题》

译文《最常见的10种Java异常问题》
; 异常管理的最佳实践箴言

如果可以正确处理异常,则应将其捕获并处理,否则应将其抛出。

译文《最常见的10种Java异常问题》
为什么在try代码块中声明的变量不能在catch或者finally中被引用?

看下面这段代码,在try代码块中声明的 String s 就不能在catch中被引用, 这段代码在编译期是通不过的。


try {
    File file = new File("path");
    FileInputStream fis = new FileInputStream(file);
    String s = "inside";
} catch (FileNotFoundException e) {
    e.printStackTrace();
    System.out.println(s);
}

原因是你不知道在try代码块中哪个位置会引发异常, 很有可能在声明对象之前就引发了异常。对于这个特定的示例,是正确的。

译文《最常见的10种Java异常问题》
为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?

它俩抛出的异常确实不同,但这是JDK的问题,当时开发这两个接口的开发人员不是同一波,所以我们没必要去纠结这个问题。


Integer.parseInt(null);

Double.parseDouble(null);

译文《最常见的10种Java异常问题》
Java中经常使用的运行时异常

这里列举一部分:

IllegalArgumentException
ArrayIndexOutOfBoundsException

在有些场景某个目标对象不满足我们的预期,会用到这些异常,例如下面在 if 判断语句中被使用:


if (obj == null) {
   throw new IllegalArgumentException("obj can not be null");

译文《最常见的10种Java异常问题》
我们可以在同一个catch子句中捕获多个异常吗?

答案是当然可以,不过如果在同一个catch子句中捕获的这些异常都直接或间接继承自同一父类,那么就只能在catch子句中捕获父类了。


catch (AException a) {
     logger.error(a);
     throw new MyException("a");
catch (BException b) {
     logger.error(b);
     throw new MyException("b");
}catch (CException c) {
     logger.error(c);
     throw new MyException("c");
}

catch(AException | BException | CException ex){
     logger.error(ex);
     throw new MyException(ex);
}

补充说明 : 其实是这样,在 Java7 就开始支持catch子句捕获多个异常,多个异常使用 XOR符号(I)连接,异常的发生有可能是 A | B,但不能同时出现,相当于这些异常不能是间接或直接继承自同一个父类,因为如果AB都继承同一父类,那就不能 A|B 都写上,这也是继承原则。

译文《最常见的10种Java异常问题》
在 Java 中构造方法能抛出异常吗?

答案是当然可以,构造方法仅是一种特殊方法而已。可以参考这个示例

译文《最常见的10种Java异常问题》
; 在 final 代码块中抛出异常

下面这个写法是合法的:


public static void main(String[] args) {
    File file1 = new File("path1");
    File file2 = new File("path2");
    try {

        FileInputStream fis = new FileInputStream(file1);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            FileInputStream fis = new FileInputStream(file2);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

但是为了获得更好的代码可读性,你应该将把 try-catch代码块封装成一个新方法,然后将方法调用放在finally子句中:


public static void main(String[] args) {
    File file1 = new File("path1");
    File file2 = new File("path2");
    try {

        FileInputStream fis = new FileInputStream(file1);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {

        methodThrowException();
    }
}

译文《最常见的10种Java异常问题》
try语句有return那么finally还会执行吗?

答案是肯定会执行。

Java官方文档描述:The finally block always executes when the try block exits

意思就是 ” 只要存在try代码块,finally代码块就一定会执行 ” ,这种特性可以让程序员避免在try语句中使用return, continue或者break关键字而忽略了关闭相关资源的操作等。

译文《最常见的10种Java异常问题》
; 为何有些开发人员对异常置之不理?

很多时候会见到下面这种代码写法。允许的情况下尽可能捕获异常并且进行处理,不知道为什么很多开发人员就是这么干?


try {
     ...

} catch(Exception e) {
     e.printStackTrace();
}

忽略异常是一件很容易做到的事,虽然这种写法很常见,但不一定是正确的写法。

参考文献:
  1. Unchecked exceptions in Java
  2. The root of Java exception class hierarchy
  3. Java exceptions related questions in stackoverflow

译文完,由于个人理解能力和知识宽度有限,译文中存在失误之处,还请见谅,欢迎指正。

译文《最常见的10种Java异常问题》

Original: https://www.cnblogs.com/panshenlian/p/14095564.html
Author: 潘潘和他的朋友们
Title: 译文《最常见的10种Java异常问题》

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608852/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot扩展接口- BeanFactoryPostProcessor后置处理器

    BeanFactoryPostProcessor接口,对BeanFactory进行后置方法调用 BeanFactoryPostProcessor分为两组:BeanDefinitio…

    Java 2023年5月30日
    068
  • java中synchronized关键字

    synchronized是java中的一个关键字,在中文中为同步,也被称之为’同步锁’,以此来达到多线程并发访问时候的并发安全问题,可以用来修饰代码块、非静…

    Java 2023年6月8日
    072
  • springboot各层作用

    搞懂springboot各层作用 总结springboot项目流程 Springboot项目分为以下几个层: controller层:控制层,负责前后端交互,接收前端发送的请求,然…

    Java 2023年6月7日
    062
  • 单线程的Node.js是如何实现高并发的

    nodejs单进程单线程事件驱动 Node遵循的是单线程单进程的模式,node的单线程是指js的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理I…

    Java 2023年5月30日
    073
  • MongoDB数据库备份与恢复

    执行MongoDB的备份与恢复需要在MongoDB的目录下执行 1.MongoDB数据备份命令./mongodump -u test -p 123456 -h 192.168.1….

    Java 2023年6月8日
    067
  • spring时遇到的小问题

    最近在学习spring的时候遇到了两个小问题,在此总结一下 1.少导了所需要的包 运行测试程序,报出以下错误. 初步分析,得知是dataSource数据源没有创建成功,以为data…

    Java 2023年6月14日
    048
  • 想入门数据结构,却总是拜倒在链表的石榴裙下?

    大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦不过这篇文章呢,还是想跟大家聊一聊数据结构与算法,学校也是大二上才开设了数据…

    Java 2023年6月5日
    087
  • Spring boot——JMX 监控

    spring.jmx.enabled=true 在命令行中执行 jconsole命令启动”Java管理和监视控制台”,然后选择org.springframe…

    Java 2023年5月30日
    077
  • MySQL

    数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。顾名思义是存储数据的仓库,实际上就是一堆文件,这些文件中存储了具有特定格式的数据 数据库管理系统:…

    Java 2023年6月6日
    054
  • AQS源码三视-JUC系列

    AQS源码三视-JUC系列 前两篇文章介绍了AQS的核心同步机制,使用CHL同步队列实现线程等待和唤醒,一个int值记录资源量。为上层各式各样的同步器实现画好了模版,像已经介绍到的…

    Java 2023年6月13日
    076
  • rocketMQ 双机房部署

    posted on2020-05-08 21:43 偶尔发呆 阅读(707 ) 评论() 编辑 Original: https://www.cnblogs.com/allenwas…

    Java 2023年5月30日
    077
  • springboot 模拟上次文件: MultipartFile + json餐食

    首先来看,接口及参数 postman模拟上传 需求:将生成好的,远程excel附件,以及一些常规数据通过接口,传递过去。 代码部分: 1.将远程excel附件,转化为Multipa…

    Java 2023年5月30日
    081
  • 戏说领域驱动设计(十五)——内核元素

    前面细讲了基于CQS的4层架构,其中的领域模型层也就是六边型架构中的内核在整个开发流程中工作占比最大,也是需要工程师最需要关注地方。那么话说回来了,里面到底包含了什么东西需要投入如…

    Java 2023年6月7日
    083
  • ThreadLocalRandom类原理分析

    public int nextInt(int bound) { if (bound > 31); else { for (int u = r; u – (r = u % bo…

    Java 2023年6月5日
    076
  • element-ui el-table 悬停/选中 行样式,鼠标样式

    /* 用来设置当前页&am…

    Java 2023年6月9日
    082
  • Node.js下载安装与配置(windows)

    一、Node.js下载 官网下载地址:下载 | Node.js 中文网 (nodejs.cn) 以Windows64位安装版为例,点击”Windows 安装包(.msi…

    Java 2023年6月8日
    045
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球