"投掷"做了什么以及它有什么用?

Pot*_*ike 11 java methods exception-handling exception keyword

我是Java新手,刚刚遇到一个在方法中使用"Throws"关键字的教程.我对此做了一些研究,但仍然没有真正理解它.

从我到目前为止看到的,它告诉编译器在该特定方法中可能抛出某个异常.为什么我们需要告诉编译器呢?我在我的方法中只使用了一个try-catch语句制作了许多程序,它运行得很好 - 当然这是管理异常的try-catch语句,对吧?

Joh*_*ers 39

您可以使用和正如您所说的那样方法中管理异常.在这种情况下,您不需要使用.例如:trycatchthrows

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

但是假设你有一千种方法,所有这些方法都可能会抛出一种方法SpaceInvadersException.然后你最终必须编写所有复杂的错误处理代码一千次.当然,你总是可以创建ErrorHandler一个类dealWithSpaceInvadersException(),你可以从他们调用方法,但你仍然可以用一千卡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 */
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1 - 迄今为止的最佳答案.很好的例子. (4认同)

And*_*mas 5

throws关键字声明该异常可能抛出出来的方法。

您还可以使用catch块来捕获方法内部的异常。如果您抓住它并且不将其抛出,那么它就不会被抛出该方法之外。

throws声明允许编译时间验证的是,方法之一:

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