9.5.关于异常最常被问到的十个问题

这篇文字总结了关于java异常最常被问到的十个问题。

10.1 检查的和不被检查的

简单来说,被检查的异常在方法中必须明确被捕获或者声明在方法的throw子句中。未被检查的异常是比如除0或者空指针等不能被解决的问题。

被检查异常特别重要,因为你期望其他用你API的人能够知道如何处理这些异常。
举个例子,IOException 是常见的被检查异常;RuntimeException是一种不被检查的异常。在阅读剩下内容之前,你可以先看下异常的类层次结构图:

9.5.关于异常最常被问到的十个问题_第1张图片
异常继承类图

10.2 异常管理的最佳实践

如果一个异常可以被正确的处理,那么它应该被捕获,否则,它应该被抛出。

10.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哪里会抛出什么异常。很可能异常在声明前就被抛出了,在这一些特定的例子中是真实的。

10.4 为什么 Double.parseDouble(null) 和Integer.parseInt(null)抛出不同的异常。
它们确实抛出不同的异常。这是JDK的问题。它们被不同的开发者所开发,所以不值得思考太多。

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

10.5 在Java中常用的运行时异常的办法

这是其中的一个例子,非法的参数异常ArrayIndexOutOfBoundsException当条件不满足的时候,它们在if语句中可以这样用:

If (obj == null ) {
  throw new IllegalArgrumentException(“obj can not be null”);
}

10.6 我们怎么能够在一个Catch方法中捕获多个异常

答案是肯定的。只要这些异常在类的继承结构中可以追溯到相同的父类,你可以使用一个超类。

10.7 构造函数在java中可以抛出异常吗?

答案是肯定的。构造函数是特殊的方法。这里有个代码例子。

class FileReader{
    public FileInputStream fis = null;
 
    public FileReader() throws IOException{
        File dir = new File(".");//get current directory
        File fin = new File(dir.getCanonicalPath() + File.separator + "not-existing-file.txt");
        fis = new FileInputStream(fin);
    }
}

10.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块,然后把这个方法放到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();
    }
}

10.9 能够在finally块中用return语句吗

可以。

10.10 为什么开发者认为应该默默地消除异常

很多代码块是如下写法,如果合适的异常处理非常重要,为什么开发者还这样做。

Try {
…
} catch (Exception e) {
e.printStackTrace();
}

忽略非常容易。
经常发生的不意味着是正确的。

赞助我

支持我可以扫描下面微信图片,支持一元,让我写的更加有动力,谢谢!

9.5.关于异常最常被问到的十个问题_第2张图片
扫描支付一元

你可能感兴趣的:(9.5.关于异常最常被问到的十个问题)