【问题标题】:What does "Throws" do and how is it helpful? [duplicate]“投掷”有什么作用,它有什么帮助? [复制]
【发布时间】:2013-08-28 14:38:19
【问题描述】:

我是 Java 新手,刚刚看到一个在方法中使用“Throws”关键字的教程。我对此进行了一些研究,但仍然不太了解。

从我目前看到的情况来看,它告诉编译器在那个特定的方法中可能会抛出某个异常。为什么我们需要告诉编译器这个?我在我的方法中仅使用 try-catch 语句制作了许多程序,并且效果很好 - 肯定是这些 try-catch 语句管理异常,对吧?

【问题讨论】:

  • Java 使用 throws 子句告诉编译器可以抛出异常的方法是正确的。但它也会警告调用者在调用该方法时可能发生的特定异常。所以方法的调用者可以在此基础上采取一些步骤。

标签: java exception methods exception-handling keyword


【解决方案1】:

如您所说,您可以使用trycatch 在方法中管理异常。在这种情况下,您不需要使用throws。例如:

public void myMethod()
{
  try {
    /* Code that might throw an exception */
  }
  catch (SpaceInvadersException exception) {
    /* Complicated error handling code */
  }
}

但是假设你有一千个方法,所有这些方法都可能抛出一个SpaceInvadersException。然后,您最终将不得不编写所有复杂的错误处理代码一千次。当然,您总是可以创建一个带有 dealWithSpaceInvadersException() 方法的 ErrorHandler 类,您可以从它们那里调用该方法,但您仍然会遇到一千个 try-catch 块。

相反,您告诉编译器这上千种方法中的每一种都可能抛出SpaceInvadersException。然后任何调用这些方法之一的方法都需要自己处理错误,要么使用try-catch,要么告诉编译器可能会抛出SpaceInvadersException。这是使用throws 关键字完成的,如下所示:

public void myMethod() throws SpaceInvadersException
{
  /* Code that might throw an exception */
}

public void callingMethod()
{
  try {
    myMethod();
  }
  catch (SpaceInvadersException exception) {
    /* Complicated error handling code */
  }
}

在这种情况下,您需要通知编译器myMethod 可能会抛出SpaceInvadersException。这意味着您不能在不以某种方式处理异常的情况下调用该方法(try-catch 或在调用方法上使用throws 关键字)。如果throws 不存在,您可以在不进行任何异常处理的情况下调用该方法,并得到一个程序中任何地方都没有处理的异常(这会很糟糕)。

由于避免代码重复总是更好,因此通常最好将错误处理交给 try-catch 在更高级别的函数中,而不是在所有代码中单独处理低级方法。这就是为什么存在这种机制的原因。

【讨论】:

  • +1 - 迄今为止的最佳答案。很好的例子。
  • 我比其他所有人都更了解这个答案,尽管他们都以自己的方式提供了帮助。谢谢。
  • 没问题!我很高兴能提供帮助。
【解决方案2】:

throws 关键字声明异常可以在方法的out 中抛出。

您还可以使用catch 块来捕获方法内的异常。如果你抓住它并且不重新抛出它,那么它不会被抛出方法。

throws 声明允许编译时验证方法:

  • 捕获它抛出的异常,包括它调用的方法中的异常。
  • 或声明它们,以便其调用者可以进行相同的检查。

【讨论】:

    【解决方案3】:

    更高,是的,某些方法必须捕获抛出的异常。就像你说的那样,管理它们的是 try-catch 块。

    但有一个例外,那就是 RuntimeException,您不需要为此声明 throws 异常部分。 RuntimeException(及其所有子类)称为未经检查的异常,之后通常无法恢复。

    【讨论】:

      【解决方案4】:

      Throws 是一种向调用方法抛出异常的机制。这通常用于将异常抛出到可以处理的级别。

      一个实际的例子是带有一些后端逻辑的基于 gui 的应用程序。如果后端出现问题,您可能希望向用户显示适当的消息。因此,您可以从您的后端向您的 UI 类抛出异常,然后相应地显示一条消息。

      【讨论】:

      • "Throws" 不会引发异常 - 它声明可能会引发异常。
      • @AndyThomas 完全同意,但是如果方法声明中有 throws,那就意味着你要抛出异常。
      • 这意味着调用者应该假设你的方法可以抛出声明的异常。您的方法可能永远不会真正引发异常。您的第一段需要编辑;它表明“抛出”会导致抛出异常。
      【解决方案5】:

      Java程序在任何时候都会抛出异常。但是,有时您会想要手动抛出异常,因为使用了throws关键字。

      例如: class Abc { public static void main(String args[]) throws IOException{ }}

      【讨论】:

      • 我没有选票,但这基本上是不正确的。
      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多