【Simple Java】10个关于Java异常的常见问题

这篇文章总结了十个经常被问到的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/

时间: 2024-11-11 06:21:46

【Simple Java】10个关于Java异常的常见问题的相关文章

10 Best Java Tools That Every Java Programmers Should Know

http://devzum.com/2015/01/15/10-best-java-tools-that-every-java-programmers-should-know/ 10 Best Java Tools That Every Java Programmers Should Know Jan 15, 2015by vikas in TOOLS Computer development is all based on a resource called Language. The way

Yet Another 10 Common Mistakes Java Developers Make When Writing SQL (You Won’t BELIEVE the Last One)--reference

(Sorry for that click-bait heading. Couldn't resist ;-) ) We're on a mission. To teach you SQL. But mostly, we want to teach you how to appreciate SQL. You'll love it! Getting SQL right or wrong shouldn't be about that You're-Doing-It-Wrong? attitude

【转】10个关于java单例模式的面试问题

10 interview question on Singleton Pattern in Java Question starts with What is Singleton class? Have you used Singleton before? Singleton is a class which has only one instance in whole application and provides a getInstance() method to access the s

如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习<深入理解java虚拟机-JVM高级特性与最佳实践>这本书,终于初步了解了一下java虚拟机的内存模型.本文通过写出使jvm发生内存溢出异常的代码来对自己的学习结果进行总结,同时也提醒自己以后写代码时候不要再跳进这个坑啦. java的内存管理是由java虚拟机自动进行管理的,并不需要程序员过多的手动干预

【Java】 Thinking in Java 2-11 练习10

题目: 编写一个程序,打印出从命令行获得的三个参数.为此,需要确定命令行数组中String的下标. 该题旨在考察:public static void main(String[] args){}; page 31:main()方法的参数是一个String对象的数组.在这个程序中并未用到args,但是Java编译器要求必须这样做,因为args要用来存储命令行参数. 程序代码: 1 public class Practices_2_10 { 2 3 public static void main(S

带你玩转java多线程系列 一 java.lang.IllegalThreadStateException异常

java的线程状态和java.lang.IllegalThreadStateException异常 文章结构: 1 阐明java声明周期的六种状态 2 由于自己操作错误,对同一个线程实例同时调用了两次start方法从而抛了java.lang.IllegalThreadStateException这个异常 3 超哥带你分析为啥抛了这个异常 4 超哥想看到赞 哈哈 1 阐明java声明周期的六种状态 线程的生命周期有六种,由Thread.State枚举类表示,线程的状态可以用getState方法来查

hive使用python脚本导致java.io.IOException: Broken pipe异常退出

反垃圾rd那边有一个hql,在执行过程中出现错误退出,报java.io.IOException: Broken pipe异常,hql中使用到了python脚本,hql和python脚本近期没有人改过,在10.1号时还运行正常,但是在10.4号之后运行就老是出现相同的错误,而且错误出现在stage-2的reduce阶段,gateway上面的错误提示如下: 2014-10-10 15:05:32,724 Stage-2 map = 100%, reduce = 100% Ended Job = jo

Java:优雅地处理异常真是一门学问啊!

本篇我们来谈谈如何优雅地处理异常. 01.异常处理机制可以少出 bug 你有没有这样的印象,当你想要更新一款 APP 的时候,它的更新日志里总有这么一两句描述: 修复若干 bug 杀了某程序员祭天,并成功解决掉他遗留的 bug 作为一名负责任的程序员,我们当然希望程序不会出现 bug,因为 bug 出现的越多,间接地证明了我们的编程能力越差,至少领导是这么看的. 事实上,领导是不会拿自己的脑袋宣言的:"我们的程序绝不存在任何一个 bug."但当程序出现 bug 的时候,领导会毫不犹豫地

Java程序员必备:异常的十个关键知识点

前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常. 一个文件找不到的异常: public class TestException { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("jaywei.t

java发送邮件监控并记录异常

根据项目管理的内容,我们一般在立项之前,需要对项目可行性进行分析.论证.评估,最终需要出具<项目可行性分析报告>,论证项目在技术.经济.运行环境以及其他项目相关方面的可行性.效益.必要性.理论很好,避免项目失败.因为作可行性分析只占项目投资的0.5%~1%,如果能在前期就能把问题论证好了,当然是功德无量的一件事情.但是在实践中,项目可行性却无法起到相应的作用.在项目中,人是最大的主观因素,人也是最大的决定因素.所以也要从人讲起:客户:客户是投资人,是项目发起人.客户虽然不知道项目如何实现,实现