这篇文章总结了十个经常被问到的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. 详谈Hibernate框架关系映射!

    接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!! 你还可以保存一个对象, ...

  2. MVC之前的那点事儿系列

    MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译,转载,整理等各类型文章,当然也参考了博客园 ...

  3. Web API:将FlexChart导出为图片

    如果想要将FlexChart在应用之外使用,比如使用在报表中,Web API帮助你将FlexChart导出成任何你需要的图片格式. 下面是实现的步骤: 1:创建FlexChart 2:调用Servic ...

  4. spring笔记2 spring MVC的基础知识2

    2,spring MVC的注解驱动控制器,rest风格的支持 作为spring mvc的明星级别的功能,无疑是使得自己的code比较优雅的秘密武器: @RequestMapping处理用户的请求,下面 ...

  5. 导出 XE6 预设 Android Style (*.style) 档案

    如果想要修改 Android Style 可以将它导出成 *.style 后再加入 TStyleBook 内来修改(iOS 的方法亦同):

  6. 设计模式之 面向对象的养猪厂的故事,C#演示(一)

    对于设计模式, 从本质上说, 其最大的用途就是适应需求的变化. 因为有了设计模式,我们可以在设计阶段就为未来可能发生的变化留下足够的空间. 我们通过一个建造现代化养猪场的故事, 来讨论一下设计模式与需 ...

  7. ORM查询语言(OQL)简介--高级篇:脱胎换骨

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  8. PHP发短信 PEAR 包:Services_Sms

    PHP发短信 PEAR 包:Services_Sms 对于这种第三方库,PHP官方称之为PEAR,需要按照PEAR标准开发(标准URI). PEAR的优势:一键安装到php/lib/php目录,req ...

  9. JS的window.location应用实例

    window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面. Window Locationwindow.location 对象在编写时可不使用 window ...

  10. CSS3动画处理浏览器内核时候前缀(兼容性)

    Gecko内核   css前缀为"-moz-" 火狐浏览器 WebKit内核 css前缀为"-webkit-"    Comodo Drangon(科摩多龙), ...