10个关于Java异常的常见问题

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

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

简单的说,检查型异常是指须要在方法中本身捕获异常处理或者声明抛出异常由调用者去捕获处理;程序员

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

检查型异常很是重要,由于你但愿使用你API接口的人知道如何处理这些异常;ide

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

Java的异常层级关系图以下:指针

2.异常管理最佳实践

若是一个异常当前可以被恰当的处理,那么应该捕获处理它,不然应该显示的抛出异常;code

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

以下代码,在try代码块中声明字符串s变量,可是不能在catch代码块中使用,代码不能编译经过;orm

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

缘由是由于你不知道在try代码块中的哪一句会抛出异常,颇有可能这个异常在变量声明以前就抛出了;对象

这正是以上这个例子的状况;blog

注:强烈怀疑是由于做用域的关系致使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/

相关文章
相关标签/搜索