最常见的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. 为何有些开发人员对异常置之不理?

1.检查型异常(checked) vs 非检查型异常(Unchecked)

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

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

2.异常管理的最佳实践箴言

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

3. 为什么在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代码块中哪个位置会引发异常, 很有可能在声明对象之前就引发了异常。对于这个特定的示例,是正确的。

4.为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?

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

Integer.parseInt(null); 
// throws java.lang.NumberFormatException: null Double.parseDouble(null); 
// throws java.lang.NullPointerException

5.Java中经常使用的运行时异常

这里列举一部分:

IllegalArgumentException ArrayIndexOutOfBoundsException

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

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

6.我们可以在同一个catch子句中捕获多个异常吗?

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

// Java 7 之前需要这样
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");
}// 在Java 7中,可以捕获所有这些异常 
catch(AException | BException | CException ex){logger.error(ex);throw new MyException(ex);
}

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

7.在 Java 中构造方法能抛出异常吗?

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

class FileReader{public FileInputStream fis = null;public FileReader() throws IOException{File dir = new File(".");//get current directoryFile fin = new File(dir.getCanonicalPath() + File.separator + "not-existing-file.txt");fis = new FileInputStream(fin);}
}

8.在 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(); }
}

9.try语句有return那么finally还会执行吗?

答案是肯定会执行。

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

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

10.为何有些开发人员对异常置之不理?

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

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

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


往期推荐

SpringBoot接口幂等性实现的4种方案!


try-catch-finally中的4个巨坑,老程序员也搞不定!


对象复制的7种方法,还是Spring的最好用!


关注我,每天陪你进步一点点!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java获取文件类型的5种方法

前言工作中经常会用到,判断一个文件的文件类型,这里总结一把,一般判断文件类型的原理有2种方式:根据文件扩展名判断优点:速度快,代码简单缺点:无法判断出真实的文件类型,例如一些伪造…

你以为用了BigDecimal后,计算结果就一定精确了?

BigDecimal,相信对于很多人来说都不陌生,很多人都知道他的用法,这是一种java.math包中提供的一种可以用来进行精确运算的类型。很多人都知道,在进行金额表示、金额计算等场景,不能使用double、float等类型,…

Google 开源的依赖注入库,比 Spring 更小更快!

来源 | zhuanlan.zhihu.com/p/24924391Guice是Google开源的一个依赖注入类库,相比于Spring IoC来说更小更快。Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式。学习目标概述:了解Guice是什么,有什么特点…

这个 bug 让我更加理解 Spring 单例了

谁还没在 Spring 里栽过跟头呢,从哪儿跌倒,就从哪儿睡一会儿,然后再爬起来。讲点儿武德 这是由一个真实的 bug 引起的,bug 产生的原因就是忽略了 Spring Bean 的单例模式。来,先看一段简单的代码。public class TestS…

mysql优化--叶金荣老师讲座笔记

copy to tmp table执行ALTER TABLE修改表结构时建议:凌晨执行Copying to tmp table拷贝数据到内存中的临时表,常见于GROUP BY操作时建议:创建索引Copying to tmp table on disk临时结果集太大,内存中放不下,需要将内存…

废弃fastjson!大型项目迁移Gson保姆级实战

前言本篇文章是我这一个多月来帮助组内废弃fastjson框架的总结,我们将大部分Java仓库从fastjson迁移至了Gson。这么做的主要的原因是公司受够了fastjson频繁的安全漏洞问题,每一次出现漏洞都要推一次全公司的fastjson强制版本升级,很令公司头…

学到了!MySQL 8 新增的「隐藏索引」真不错

MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 "不可见索引"。隐藏索引是什么鬼? 隐藏索引 字面意思…

iOS开发-自定义UIAlterView(iOS 7)

App中不可能少了弹框,弹框是交互的必要形式,使用起来也非常简单,不过最近需要自定义一个弹框,虽然iOS本身的弹框已经能满足大部分的需求,但是不可避免还是需要做一些自定义的工作。iOS7之前是可以自定义AlterView的&am…

Spring 事务失效的 8 大场景,面试官直呼666...

前几天发了一篇文章里面有一个关于事务失效的问题:用 Spring 的 Transactional 注解控制事务有哪些不生效的场景?其中有个热心粉丝留言分享了下,我觉得总结得有点经验,给置顶了:但是我觉得还是总结得不够全&#xff0c…

认真聊一下MySQL索引的底层实现!

前言当我们发现SQL执行很慢的时候,自然而然想到的就是加索引,当然他也是高频的面试问题,所以今天我们一起来学习一下MySQL索引的底层实现:B树。树简介、树种类B-树、B树简介B树插入B树查找B树删除B树经典面试题树的简介树的简介树…

最新大厂面试真题集锦

年后又是一波求职季,正是“金三银四”这个求职黄金期,很多人扎堆在这个时间段跳槽,找工作,程序员也不例外。春节刚过,各公司企业都开始启动了新一年的招聘计划,招聘岗位倍增,求职人数远超于岗位…

使用OpenCV在Python中进行人脸和眼睛检测

Modules Used: 使用的模块: python-opencv(cv2)python-opencv(cv2) python-opencv(cv2) Opencv(Open source computer vision) is a python library that will help us to solve computer vision problems. Opencv(开源计算机视觉)是一个Python库,可帮…

Java打造一款SSH客户端,已开源!

最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:GateOne、webssh、she…

我去,这几个Linux指令太装B了|动图展示

1. sl先看一下呼啸而过的火车;安装指令如下;sduo apt-get install sl执行结果如下:2. htop图形化Linux系统性能监测工具,屌不屌:安装指令如下:sduo apt-get install htop执行结果如下;3. gcp以前用cp复制文件总是看不懂…

书店POS机--细化迭代2--测试

2019独角兽企业重金招聘Python工程师标准>>> (1) 开始一次新的销售,点击书店POS系统的销售: (2) 进入销售模块之后的界面如下: (3)逐条录入商品条目(根据商品编号),并修改数量。确认无误之后点击“确认”按钮&#x…

Google Guava,牛逼的脚手架

01、前世今生你好呀,我是 Guava。1995 年的时候,我的“公明”哥哥——Java 出生了。经过 20 年的发展,他已经成为世界上最流行的编程语言了,请允许我有失公允的把“之一”给去了。虽然他时常遭受着各种各样的吐槽,但他…

阿里巴巴Druid,轻松实现MySQL数据库加密!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)为什么要加密?现在的开发习惯,无论是公司的项目还是个人的项目,都会选择将源码上传到 Gi…

计算机图形学图形旋转_计算机图形学中的平板显示

计算机图形学图形旋转平板显示器 (Flat Panel Display) It is generally known as FPD, the flat-panel display is such a display technology which overtakes Cathode Ray Tube as a new standard of computer desktop displays. Unlike monitors through CRT, flat-panel d…

一文掌握Redisson分布式锁原理|干货推荐

ReentrantLock 重入锁在说 Redisson 之前我们先来说一下 JDK 可重入锁: ReentrantLockReentrantLock 保证了 JVM 共享资源同一时刻只允许单个线程进行操作实现思路ReentrantLock 内部公平锁与非公平锁继承了 AQS[AbstractQueuedSynchronizer]1、AQS 内部通过 volatil 修饰的 in…

7种分布式事务的解决方案,一次讲给你听

本文约5300字,阅读时长「5分钟」什么是分布式事务分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器「分别位于不同的分布式系统的不同节点之上」。一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针对于这些操…