【Java】译文《最常见的10种Java异常问题》

译文《最常见的10种Java异常问题》

潘潘和他的朋友们发布于 今天 01:01

【Java】译文《最常见的10种Java异常问题》

【Java】译文《最常见的10种Java异常问题》

知彼知己,方能百战不殆。

前言

本文总结了有关Java异常的十大常见问题。

目录

  1. 检查型异常(checked) vs. 非检查型异常(Unchecked)
  2. 异常管理的最佳实践箴言
  3. 为什么在try代码块中声明的变量不能在catch或者finally中被引用?
  4. 为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?
  5. Java中经常使用的运行时异常
  6. 我们可以在同一个catch子句中捕获多个异常吗?
  7. 在 Java 中构造方法能抛出异常吗?
  8. 在 final 代码块中抛出异常
  9. try语句有return那么finally还会执行吗?
  10. 为何有些开发人员对异常置之不理?

【Java】译文《最常见的10种Java异常问题》

检查型异常(checked) vs. 非检查型异常(Unchecked)

例如,IOException就是常见的检查型异常,而 RuntimeException(运行时异常)就是非检查型异常。在阅读剩余部分之前你或许可以研读这份 Java异常的层次结构图。

【Java】译文《最常见的10种Java异常问题》

【Java】译文《最常见的10种Java异常问题》

异常管理的最佳实践箴言

如果可以正确处理异常,则应将其捕获并处理,否则应将其抛出。

【Java】译文《最常见的10种Java异常问题》

为什么在try代码块中声明的变量不能在catch或者finally中被引用?

看下面这段代码,在try代码块中声明的 String 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代码块中哪个位置会引发异常, 很有可能在声明对象之前就引发了异常。对于这个特定的示例,是正确的。

【Java】译文《最常见的10种Java异常问题》

为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?

它俩抛出的异常确实不同,但这是JDK的问题,当时开发这两个接口的开发人员不是同一波,所以我们没必要去纠结这个问题。

Integer.parseInt(null);

// throws java.lang.NumberFormatException: null

Double.parseDouble(null);

// throws java.lang.NullPointerException

【Java】译文《最常见的10种Java异常问题》

Java中经常使用的运行时异常

这里列举一部分:

在有些场景某个目标对象不满足我们的预期,会用到这些异常,例如下面在 if 判断语句中被使用:

if (obj == null) {

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

【Java】译文《最常见的10种Java异常问题》

我们可以在同一个catch子句中捕获多个异常吗?

答案是当然可以,不过如果在同一个catch子句中捕获的这些异常都直接或间接继承自同一父类,那么就只能在catch子句中捕获父类了。

// Java 7 之前需要这样

catch (AException a) {

logger.error(a);

throw new MyException("a");

catch (BException b) {

logger.error(b);

throw new MyException("b");

}catch (CException c) {

logger.error(c);

throw new MyException("c");

}

// 在Java 7中,可以捕获所有这些异常

catch(AException | BException | CException ex){

logger.error(ex);

throw new MyException(ex);

}

【Java】译文《最常见的10种Java异常问题》

在 Java 中构造方法能抛出异常吗?

答案是当然可以,构造方法仅是一种特殊方法而已。可以参考这个示例。

【Java】译文《最常见的10种Java异常问题》

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

}

}

【Java】译文《最常见的10种Java异常问题》

try语句有return那么finally还会执行吗?

答案是肯定会执行。

意思就是 ” 只要存在try代码块,finally代码块就一定会执行 ” ,这种特性可以让程序员避免在try语句中使用return, continue或者break关键字而忽略了关闭相关资源的操作等。

【Java】译文《最常见的10种Java异常问题》

为何有些开发人员对异常置之不理?

很多时候会见到下面这种代码写法。允许的情况下尽可能捕获异常并且进行处理,不知道为什么很多开发人员就是这么干?

try {

...

} catch(Exception e) {

e.printStackTrace();

}

忽略异常是一件很容易做到的事,虽然这种写法很常见,但不一定是正确的写法。

参考文献:

  1. Unchecked exceptions in Java
  2. The root of Java exception class hierarchy
  3. Java exceptions related questions in stackoverflow

【Java】译文《最常见的10种Java异常问题》

【Java】译文《最常见的10种Java异常问题》

java程序员异常exception翻译

本文系翻译,阅读原文

https://www.programcreek.com/2013/10/top-10-questions-about-java-exceptions/

阅读 40发布于 今天 01:01

avatar

潘潘和他的朋友们

有点特别的架构师

1 声望

2 粉丝

0 条评论

得票时间

avatar

潘潘和他的朋友们

有点特别的架构师

1 声望

2 粉丝

宣传栏

【Java】译文《最常见的10种Java异常问题》

【Java】译文《最常见的10种Java异常问题》

知彼知己,方能百战不殆。

前言

本文总结了有关Java异常的十大常见问题。

目录

  1. 检查型异常(checked) vs. 非检查型异常(Unchecked)
  2. 异常管理的最佳实践箴言
  3. 为什么在try代码块中声明的变量不能在catch或者finally中被引用?
  4. 为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?
  5. Java中经常使用的运行时异常
  6. 我们可以在同一个catch子句中捕获多个异常吗?
  7. 在 Java 中构造方法能抛出异常吗?
  8. 在 final 代码块中抛出异常
  9. try语句有return那么finally还会执行吗?
  10. 为何有些开发人员对异常置之不理?

【Java】译文《最常见的10种Java异常问题》

检查型异常(checked) vs. 非检查型异常(Unchecked)

例如,IOException就是常见的检查型异常,而 RuntimeException(运行时异常)就是非检查型异常。在阅读剩余部分之前你或许可以研读这份 Java异常的层次结构图。

【Java】译文《最常见的10种Java异常问题》

【Java】译文《最常见的10种Java异常问题》

异常管理的最佳实践箴言

如果可以正确处理异常,则应将其捕获并处理,否则应将其抛出。

【Java】译文《最常见的10种Java异常问题》

为什么在try代码块中声明的变量不能在catch或者finally中被引用?

看下面这段代码,在try代码块中声明的 String 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代码块中哪个位置会引发异常, 很有可能在声明对象之前就引发了异常。对于这个特定的示例,是正确的。

【Java】译文《最常见的10种Java异常问题》

为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?

它俩抛出的异常确实不同,但这是JDK的问题,当时开发这两个接口的开发人员不是同一波,所以我们没必要去纠结这个问题。

Integer.parseInt(null);

// throws java.lang.NumberFormatException: null

Double.parseDouble(null);

// throws java.lang.NullPointerException

【Java】译文《最常见的10种Java异常问题》

Java中经常使用的运行时异常

这里列举一部分:

在有些场景某个目标对象不满足我们的预期,会用到这些异常,例如下面在 if 判断语句中被使用:

if (obj == null) {

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

【Java】译文《最常见的10种Java异常问题》

我们可以在同一个catch子句中捕获多个异常吗?

答案是当然可以,不过如果在同一个catch子句中捕获的这些异常都直接或间接继承自同一父类,那么就只能在catch子句中捕获父类了。

// Java 7 之前需要这样

catch (AException a) {

logger.error(a);

throw new MyException("a");

catch (BException b) {

logger.error(b);

throw new MyException("b");

}catch (CException c) {

logger.error(c);

throw new MyException("c");

}

// 在Java 7中,可以捕获所有这些异常

catch(AException | BException | CException ex){

logger.error(ex);

throw new MyException(ex);

}

【Java】译文《最常见的10种Java异常问题》

在 Java 中构造方法能抛出异常吗?

答案是当然可以,构造方法仅是一种特殊方法而已。可以参考这个示例。

【Java】译文《最常见的10种Java异常问题》

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

}

}

【Java】译文《最常见的10种Java异常问题》

try语句有return那么finally还会执行吗?

答案是肯定会执行。

意思就是 ” 只要存在try代码块,finally代码块就一定会执行 ” ,这种特性可以让程序员避免在try语句中使用return, continue或者break关键字而忽略了关闭相关资源的操作等。

【Java】译文《最常见的10种Java异常问题》

为何有些开发人员对异常置之不理?

很多时候会见到下面这种代码写法。允许的情况下尽可能捕获异常并且进行处理,不知道为什么很多开发人员就是这么干?

try {

...

} catch(Exception e) {

e.printStackTrace();

}

忽略异常是一件很容易做到的事,虽然这种写法很常见,但不一定是正确的写法。

参考文献:

  1. Unchecked exceptions in Java
  2. The root of Java exception class hierarchy
  3. Java exceptions related questions in stackoverflow

【Java】译文《最常见的10种Java异常问题》

【Java】译文《最常见的10种Java异常问题》

以上是 【Java】译文《最常见的10种Java异常问题》 的全部内容, 来源链接: utcz.com/a/109472.html

回到顶部