Simple-Java-Question-2

关于Java异常的问题 Top10

 

这个标题简单地介绍了10个Java中被问频率最高的10个异常

 

2.1 Checked vs Unchecked

简单来说,checked exceptions必须明确地捕获方法和声明中抛出的clause,Unchecked exceptions应该是那些被引起的不能解决的问题,比如除以0、空指针、etc。Checked cxceptions非常重要,因为你期望其他的开发者能够用你的API就能够知道怎么去解决这个异常。

例如,IOException就是一个通常被使用的checked exception,RuntimeException就是一个unchecked exception。你可以在阅读这些约束之前,先核对Java异常层次图。

关于checked和unchecked异常,可以看这篇文章

 

2.2 异常管理最好的实践

如果一个异常可能可以被处理,那么就应该捕获,否则,它就应该被抛出来

 

2.3 为什么一个被定义在try中的变量,不可以在catch或finally中使用

在下面的代码中,string被定义在try的代码块中,但是不能被用在catch中。

下面的代码不能通过编译

 


try {

    File file = new File("path");

    FileInputStream fis = new FileInputStream(file);

    String s = "inside";

} catch (FileNotFoundException e) {

    e.printStackTrace();

    System.out.println(s);

}

 

原因就是你不知道什么时候才会抛出异常,可能会在你定义变量之前就抛出了异常,所以不能在cath中使用try中定义的变量

 

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

它们当然会抛出不同的异常,这是JDK的问题,他们被不同的coder编写,所以,可能没有过多地去思考


Integer.parseInt(null);

// throws java.lang.NumberFormatException: null



Double.parseDouble(null);

// throws java.lang.NullPointerException

 

2.5 通常在Java中如何使用RuntimeException

这里有一些常见的运行时异常:IllegalArgumentException、ArrayIndexOutOfBoundsException

他们可以在一定条件的状态下被使用


if (obj == null) {

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

 

2.6 我们在同一个catch代码块中捕获多个异常吗

当然可以,只要这些异常的类都能够赘述到同一个父类,他们可以直接使用父类

或者,你可以这样


try{....}

catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException ie){....}

 

2.7 在java中能不能在构造方法中抛出异常

当然可以,构造方法只是一个特殊的方法而已,和普通方法没有太大的不同

 

2.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的部分单独提取出来作为一个新的方法,然后在方法中还行最后的代码

 


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();

    }

}

 

2.9 在finally模块中,能否使用return

当然可以

 

2.10为什么开发者默默地处理exception

开发中有很多的代码和下面的代码片段一样,如果处理异常是如此地重要,那么开发者为什么还要这么做???


try {

...

} catch(Exception e) {

e.printStackTrace();

}

忽略掉异常很容易,频繁地出现这样的代码,并不意味着这是正确的处理异常的代码!

 

你可能感兴趣的:(java)