JavaRush /Java 博客 /Random-ZH /关于 Java 异常的十大问题
raynn
第 31 级
Нижний Новгород

关于 Java 异常的十大问题

已在 Random-ZH 群组中发布
本文介绍了有关 Java 异常的 10 个最常见问题。 关于 Java 异常的十大问题 - 1

1. 可验证与不可验证

简而言之,检查的异常必须在方法体中显式捕获或在方法的 throws 部分中声明。未检查异常是由于无法解决的问题引起的,例如除以0、空指针等。检查异常尤其重要,因为您希望使用您的 API 的其他开发人员知道如何处理异常。例如,IOException是常用的检查异常,而RuntimeException是非检查异常。在进一步阅读之前,请查看Java 中的分层异常图

2. 处理异常的最佳方式

如果异常能够被正确处理,则必须捕获,否则必须转发。

3.为什么try中定义的变量不能在catch或finally中使用?

在下面的代码中,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);
}
原因是不知道 try 块中的何处可能引发异常。有可能在声明对象之前抛出异常。对于这个例子来说也是如此。

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

没错,他们确实提出了不同的例外情况。这是一个 JDK 问题。它们只是由不同的人设计的,您不必太担心。
Integer.parseInt(null);
// вызывает java.lang.NumberFormatException: null

Double.parseDouble(null);
// вызывает java.lang.NullPointerException

5. Java中的基本运行时异常

这里有几个:
IllegalArgumentException
ArrayIndexOutOfBoundsException
当条件不满足时,它们可以在 if 语句中使用,如下所示:
if (obj == null) {
   throw new IllegalArgumentException("obj не может быть равно null");

6. 是否可以在一个catch块中捕获多个异常?

答案是肯定的。只要这些异常的类可以沿着类继承层次结构追溯到同一个超类,就只能使用该超类。

7. 构造函数可以抛出异常吗?

答案是肯定的。构造函数只是一种特殊的方法。这是一个代码示例。

8. 在最后一个块中抛出异常

原则上,你可以完全合法地这样做:
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();
	}
}

9. 是否可以在finally 块中使用return?

是的你可以。

10、为什么开发者要悄悄处理异常?

例如,这样的代码片段经常出现。如果正确的异常处理如此重要,为什么开发人员继续这样编写呢?
try {
     ...
} catch(Exception e) {
     e.printStackTrace();
}
这是最容易被忽视的。但即使经常这样做,也不意味着它是正确的。链接:
  1. Java 中的未检查异常
  2. Java中分层异常树的根
  3. 关于stackoverflow上的异常问题
来源文章
还有什么要读的:

Java 中的异常

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION