【问题标题】:Java - Exception handling - throws [closed]Java - 异常处理 - 抛出 [关闭]
【发布时间】:2014-02-12 04:02:50
【问题描述】:

我知道 javac 强制程序员处理需要由方法抛出或使用 try-catch/finally 处理的检查异常。而且它不会阻止程序员抛出未经检查的异常。

我也知道我们为什么要 try-catch/finally 并理解为什么 java 会检查某些异常集。

但我无法理解以下内容:

Q1) 为什么方法应该“抛出”异常。我们从中得到什么好处?我认为,无论是方法抛出还是使用“抛出”不抛出,同样的事情正在发生!!!

Q2) 当方法“抛出”异常时内部会发生什么?

Q3)我认为“错误”与“异常”的分类不同,只是为了突出它们,因为“当它们发生时,程序员方面不会做太多事情”,但我们可以“抛出”“try-catch” /finally" 对它们像往常一样,其他一切也与 "Exception"*s 相同。如果我错了,请纠正我。

请帮助我。提前谢谢你。

【问题讨论】:

标签: java exception throws


【解决方案1】:

我们开始吧:

Q1) 为什么方法应该“抛出”异常。我们从中得到什么好处?

一个方法应该提及当它不能处理它抛出的异常时它抛出一个异常(方法必须指定这种行为,以便方法的调用者可以保护自己免受该异常的影响)。

Q2) 当方法“抛出”异常时,内部会发生什么?

当方法抛出异常时,控制权转移给方法的调用者,以及调用者是否有必要的catch块来处理方法抛出的异常。如果调用者有一个 catch 块来处理异常,那么将处理异常并且程序继续。如果调用者没有必要的方法来处理向其抛出的异常,则该异常将由默认异常处理程序处理。

对于您的第三个问题,请阅读摘自完整参考书的此部分:

所有异常类型都是内置类 Throwable 的子类。因此,Throwable 位于异常类层次结构的顶部。紧接 Throwable 下面是两个子类,它们将异常划分为两个不同的分支。一个分支由 Exception 领导。此类用于用户程序应捕获的异常情况。这也是您将创建自己的自定义异常类型的子类。 Exception 有一个重要的子类,称为 RuntimeException。这种类型的异常会自动为您编写的程序定义,包括除以零和无效的数组索引等内容。

另一个分支的顶部是 Error,它定义了在正常情况下不会被您的程序捕获的异常。 Java 运行时系统使用 Error 类型的异常来指示与运行时环境本身有关的错误。堆栈溢出就是此类错误的一个示例。本章不会处理 Error 类型的异常,因为这些异常通常是为了响应您的程序通常无法处理的灾难性故障而创建的。

【讨论】:

  • 谢谢。我明白这一点,请确认:(1)一个方法必须抛出一个检查异常来告诉编译器“我知道处理它很重要,但我将这个责任留给调用者”(2)我们可以在处理检查时欺骗编译器使用空catch/finally块的异常(3)一个方法抛出一个异常(checked or unchecked)让调用者更好地处理它
  • (4) Errors 只是另一个区别于其他两种类型“RuntimeExceptions”和“CheckedExceptions”的类别。我确信我们可以抛出或处理错误,但我不明白他们为什么说“错误不会被捕获”......我相信即使在严重的情况下,在退出程序之前总是需要做一些清理操作诸如错误之类的问题。
  • 您的 (1) 点是正确的。使用空的 catch 块到达 (2) 点是不好的做法,因为你会吞下异常。(3) 点方法抛出一个检查的异常,为什么我说这个因为所有未检查的异常都是运行时异常,编译器不会t 强迫你在 try/catch 子句中检查它。
  • (4) 简而言之java中的错误是指出现超出用户或程序员控制的问题。错误通常在您的代码中被忽略,因为您很少对错误采取任何措施。例如,如果发生堆栈溢出,则会出现错误。它们在编译时也会被忽略。
  • 谢谢。如果是这样,为什么 Java 在其库中有 Error 类及其子类。目的?
猜你喜欢
  • 2015-11-06
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 2011-10-10
  • 2016-04-03
  • 1970-01-01
相关资源
最近更新 更多