Java例外原理

时间:2012-01-05 18:41:04

标签: java exception exception-handling theory

这一次非常理论化的问题。所以我在Eclipse中使用这个函数:

CsvReader csv = new CsvReader("src/maindroite.csv");

由于“未处理的异常类型FileNotFoundException”而无法运行。好吧,我知道我必须为文件不存在的情况添加一些内容,此时我通常会添加几行来捕获异常并将其丢弃。但我的问题是:为什么我需要捕获异常即使文件确实存在?实际上,为什么我甚至对某些函数而不是其他函数有这个Exception?

例如,假设我正在尝试运行:

ImageIcon icon1 = new ImageIcon("src/square.jpg");
ImageIcon icon2 = new ImageIcon("src/circle.jpg");

“square.jpg”存在但不是“circle.jpg”。该程序将创建icon1,但不会创建icon2,因为它不能。但是我不需要为图像不存在的情况添加ExceptionHandler。两个函数之间有什么区别?

总结一下:

  • 为什么我必须在文件执行时添加ExceptionHandler?
  • 为什么我必须为某些功能而不是其他功能添加ExceptionHandler?

谢谢!

6 个答案:

答案 0 :(得分:4)

为什么我必须在文件存在时添加ExceptionHandler?

基本上你必须添加它,因为你不能写那样的条件代码,总之没有办法让编译器在运行之前知道文件是否存在,因此编译器强迫你去放置一个try / catch块,因为FileNotFoundException是一个checked异常。

为什么我必须为某些功能而不是其他功能添加ExceptionHandler?

您只需将try / catch块添加到抛出已检查异常的任何内容中,即执行任何操作* * NOT * 继承自RuntimeExceptionError类。 ErrorRuntimeException的子类不是已检查的异常,您可以将try / catch放在编译器不关心的情况下。由于ImageIcon的构造函数不会抛出任何类型的异常,并且如果图像不存在则只返回null,则不需要执行try / catch块。 *

答案 1 :(得分:2)

即使文件现在存在,在您的系统上也可能以后不存在。或者您可以将此代码提供给没有src/square.jpg的人。或者可能会出现硬件故障,导致硬盘驱动器上的某些内容损坏并意外删除src / square.jpg。也许用户甚至可能只删除文件。

Java中的异常处理迫使您考虑在最糟糕的情况下如果发生了非常糟糕的事情会发生什么(例如src/square.jpg丢失)。你崩溃了吗?可以继续没有发生什么事吗?您可以决定如何在catch子句中处理这些失败模式。

有些函数不要求你处理异常,因为在你可以合理地期望处理的函数中没有任何可能出错的东西。

答案 2 :(得分:1)

  

1)为什么我必须在文件存在[es]时添加ExceptionHandler?

因为Java编译器无法知道该文件是否实际存在于某个任意运行时。 (假设在编译之后但在运行程序之前文件已被删除?)基本上,您的代码必须始终具有处理预期不会发生的条件所需的逻辑,但无论如何都可能。

  

2)为什么我必须为某些功能而不是其他功能添加ExceptionHandler?

可能有各种各样的原因,但这是你可能会看到的原因。每个方法抛出异常但是如果它们向上传播,则按try / catch块或每个方法捕获。在您的示例中,您可以将每个调用包装在其自己的try / catch块中的ImageIcon构造函数中,或者两者一起,具体取决于您要执行的操作:

try {
  icon1 = new ImageIcon("f1.jpg");
} catch (Exception e) { /* Handle the case for missing "f1.jpg". */ }
try {
  icon2 = new ImageIcon("f2.jpg");
} catch (Exception e) { /* Handle the case for missing "f2.jpg". */ }

与:相比:

try {
  icon1 = new ImageIcon("f1.jpg");
  icon2 = new ImageIcon("f2.jpg");
} catch (Exception e) { /* Handle the case for missing "f1" or "f2". */ }

答案 3 :(得分:1)

因为Java区分了所谓的“已检查”和“未经检查”的异常。关于是否应该存在未经检查的异常,以及API方法是否应该抛出异常,这引起了很多激烈的争议。

根据Java Trails:

  

这是底线指南:如果客户可以合理地   期望从异常中恢复,使其成为检查异常。如果   客户端无法做任何事情从异常中恢复,使其成为一个   未经检查的例外。

这就是所谓的理由。

详细了解“争议”here

答案 4 :(得分:0)

为什么我必须在文件存在时添加ExceptionHandler?

它现在存在,但不能保证它每次都会存在。可能因为很多原因而发生。如果没有文件,那么执行InputStream和关联的业务逻辑是没有意义的,并确保您的业务不会成功。

为什么我必须为某些功能而不是其他功能添加ExceptionHandler?

像Imageicon这样的一些类,它们不会为您的业务处理提供阻止。如果他们不在那里,那没关系,你仍然可以继续你的核心业务逻辑。

我觉得这是为什么某些课程要求例外而有些不是例外的主要原因。

答案 5 :(得分:0)

检查异常背后的想法是,它们使函数的调用者能够知道哪些异常可能从中逃脱。如果您不希望将FileNotFoundException添加到方法签名中,以便让调用者知道此类异常可能会从您的方法中逃脱,则不必实际捕获throws FileNotFoundException。 / p>

这个概念很好,但不幸的是,没有简洁的方法来表明你想要捕获所有不过分严重的异常,并将它们包装成调用者的常见异常类型。在很多情况下,当发生异常时,您要传达的真实信息是“方法没有完成,但系统似乎没有起火并且任何副作用都已被撤消”,或者“该方法没有完成,系统似乎没有起火,但可能还有其他副作用。”如果有一个简洁的语法来指示应该捕获异常并将其包装到上述格式之一的代码区域,那将会很有帮助,但是没有。