这篇文章总结了十个经常被问到的JAVA异常问题;

1.检查型异常VS非检查型异常

简单的说,检查型异常是指需要在方法中自己捕获异常处理或者声明抛出异常由调用者去捕获处理;

非检查型异常指那些不能解决的异常,如除0,空指针等;

检查型异常非常重要,因为你希望使用你API接口的人知道如何处理这些异常;

举个例子,IOException是非常常见的检查型异常,RuntimeException是非检查型异常;

Java的异常层级关系图如下:

2.异常管理最佳实践

如果一个异常当前能够被恰当的处理,那么应该捕获处理它,否则应该显示的抛出异常;

3.为什么在try代码块里定义的变量,在catch或finally代码块里不能被访问

如下代码,在try代码块中声明字符串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代码块中的哪一句会抛出异常,很有可能这个异常在变量声明之前就抛出了;

这正是以上这个例子的情况;

注:强烈怀疑是因为作用域的关系导致s变量不可见;

4.为什么Integer.parseInt(null)和Double.parseDouble(null)会抛出不同的异常

这是JDK的问题,因为这两个方法是不同的开发人员写的,所以没必要深究;

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

注:其实我目前的JDK7已经没有该问题了,两个都是抛出NumberFormatException

5.多用运行时异常

几个常见的运行时异常,如IllegalArgumentException、ArrayIndexOutOfBoundsException;

当判断条件不满足时,可以抛出这些异常,如下代码:

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

6.是否可以在一个catch代码块里捕获多个异常

答案是可以的。因为JAVA的异常可以追溯到同一个父类Exception,我们可以使用父类捕获多个异常;

        try {

        } catch (Exception e) {
// TODO: handle exception
}

补充:

在JAVA7中,增加了新语法,可以这样捕获多个异常:

try {
...
} catch( IOException | SQLException ex ) {
...
}

在JAVA7之前可以这样写:

try {
//.....
} catch (Exception exc) {
if (exc instanceof IllegalArgumentException || exc instanceof SecurityException ||
exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) { someCode(); } else if (exc instanceof RuntimeException) {
throw (RuntimeException) exc; } else {
throw new RuntimeException(exc);
} }

7.构造方法是否可以抛出异常

答案是可以的,构造方法是一个特殊的方法,同样可以抛出异常;

注意,如果构造方法抛出异常,对象是没有生成的;

8.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 {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

但是出于可读性考虑,最好把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.finally代码块里是否可以写return语句

是的,可以

10.为什么JAVA程序员经常悄悄地忽略异常的处理

以下代码片段会经常出现在程序中,如果异常处理那么重要,为什么还会有这么多开发人员一直这样做呢?

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

经常出现的代码并不代表是对的;

可能很多开发人员都使用eclipse的快速修复,自动生成异常处理代码,如上所示,其实除了记录下log,并没有做什么处理;

正如条目2所描述的,如果不能正确处理该异常的话,最好抛出异常,以便异常尽早被发现;

译文链接:http://www.programcreek.com/2013/10/top-10-questions-about-java-exceptions/

10个关于Java异常的常见问题的更多相关文章

  1. 10 个深恶痛绝的 Java 异常。。

    异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java ...

  2. Java基础10:全面解读Java异常

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  3. Java异常的10个关键知识点

    前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...

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

    封面:洛小汐 译者:潘潘 知彼知己,方能百战不殆. 前言 本文总结了有关Java异常的十大常见问题. 目录 检查型异常(checked) vs. 非检查型异常(Unchecked) 异常管理的最佳实践 ...

  5. 浅谈java异常[Exception]

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...

  6. 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    本文转载自  java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...

  7. 10个调试Java的技巧

    调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷.对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序.本文介绍了Java程序员必知的10个调试技巧, ...

  8. 第11章 Java异常与异常处理

    1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...

  9. java 异常

    1.java异常 2.自定义抛出 3.运行时异常,程序有问题,让使用者可以改' ' 4.return  和  throw的区别 return 符合函数要求的值    throw  有问题的时候用它结束 ...

随机推荐

  1. 自己对Debug的一些感悟

    A.13-03-06记. 1.当项目中发现bug的时候,首先考虑如何重现,能够重现的bug比较好找寻根源. 2.思考下以前是否发现过类似bug,是否由一些外部配置所决定. 3.有循环时候注意临界条件.

  2. 取得 APP 自己的版本号 (狠跨 4 个平台)

    XE7 源码下载:[原创]取得APP自己的版本号(狠跨4个平台)XE7.zip XE6 源码下载:[原创]取得APP自己的版本号(狠跨4个平台)XE6.zip XE5 源码下载:[原创]取得APP自己 ...

  3. 解决ambiguous symbol命名空间中类名、变量名冲突的问题

    最近在将一个复杂的工程集成到现有的项目中.编译时发现,有的变量名冲突了,提示就是xxxx ambiguous symbol,并且在编译输出时,指明了两个文件当中特定的变量名或者类名相同.出现这个编译错 ...

  4. python问题记录

    今天才python群里看到一个问题 python2.7: L = [x for x in 'hello'] print L print x python3.4: L = [ x for x in 'h ...

  5. PostgreSQL的case when

    select tt.dict_label as display_item,t1.ratio from (select t.product_level,round(sum(case when t.det ...

  6. php中的字符串常用函数(五) explode 妙用

    // 示例 2 $data = "foo:*:1023:1000::/home/foo:/bin/sh" ; list( $user , $pass , $uid , $gid , ...

  7. 初学C++ 之 输入输出(IDE:vs2013)

    #include <iostream> //引用头文件(输入输出) using namespace std; //引用命名空间,方便使用输入输出语句 class MathMethod { ...

  8. Mdrill 安装部署(单机版)

    前期: -------------------------------------------------------- 准备: 1.centos6.5 /7 x86_64(后期会更改主机名称) 2. ...

  9. redis事务详解

    mysql中也存在事务的概念.其实事务的定义是一样的.一组操作的集合,作为一个整体,要么全执行,要么全不执行. redis设置事务三步骤: 开始事务 :multi 操作加入事务队列 执行事务 :exe ...

  10. MAC 卸载 mysql

    怎样才能完全卸载mysql和删除它从你的Mac(包括所有数据库)执行以下操作: 打开终端窗口 使用mysqldump备份你的数据库将文本文件! 停止数据库服务器 sudo rm /usr/local/ ...