-1

在下面的代码段中,我有些困惑。

try {

public static void showMyName(String str) throws IOException
  {
      if(str.equals("What is your Name?"))
            throw new IOException;
  }

 }catch(IOException e)
   {
      System.out.println ("Exception occurs , catch block called")
   }

现在,我的问题是throws IOException && throw new IOException之间有什么区别

为什么我们不需要使用 catch , finally 阻止 throws IOException

throws是如何处理异常的。?

4

5 回答 5

2

当 anException生成时,有两种处理方法。

  1. 处理异常 - 这使用catch
  2. 声明异常 - 这使用throws

因此,处理已经生成的异常是由catchor完成的throws

另一方面,throw在“生成”异常时使用。

通常,throw在实例化 Exception 对象或将已生成的异常级联到调用者时使用关键字。

例如,

public void doSomething(String name) throws SomeException { // Exception declared
    if( name == null ){ // cause of the exception
        throw new SomeException(); // actual NEW exception object instantiated and thrown
    }
    // Do something here
    .
    .
    .
}

在调用方法中,

public static void main(String[] args) throws SomeException{ // Need to declare exception because you're "throwing" it from inside this method.
    try { // try doing some thing that may possibly fail
        doSomething(name);
    } catch (SomeException e){
        throw e;// throw the exception object generated in doSomething()
    }
}

或者,您可以在 catch 块中“处理”异常:

public static void main(String[] args) { // No need to declare exception
    try { // try doing some thing that may possibly fail
        doSomething(name);
    } catch (SomeException e){
        System.out.println("Exception occurred " + e.getMessage()); // Handle the exception by notifying the user.
    }
}

希望这可以帮助。

附录 - 异常处理词汇表

  • try- 用于调用可能导致异常的代码或文件/流/网络/数据库连接等资源。
  • catch- 在try块之后立即使用以“处理”或“抛出”异常。如果使用可选finally
  • finally- 在 atrycatch块之后立即使用。可选的。用于执行“必须”执行的代码。finally块中的代码总是被执行——即使tryorcatch有一个return语句。
  • throw- 用于通过调用方法“推送”或“级联”异常。总是在方法内部使用。
  • throws- 用于“声明”如果出现问题,方法将抛出异常。始终用作方法签名的一部分。

附加阅读

这是一篇详尽的文章,可帮助您理解 java 中的 try-catch-finally 语义。

更新

要回答你的另一个问题,

为什么我们不需要使用 catch , finally 阻止 throws IOException ?

catchthrows视为相互排斥的结构。(这并不总是正确的,但为了您的理解,最好从这个想法开始。)

你声明它的一个方法throws IOException。这段代码是在您声明方法的地方编写的。而且,从语法上讲,您不能将方法声明放在 try 块中。

throws 是如何处理异常的。?

就像我之前提到的,catchfinally异常处理期间使用。throws只是用于将异常级联回调用者。

于 2015-01-07T11:43:28.367 回答
1

throw new IOException意味着您遇到了一些错误情况并决定通过抛出异常来中断程序的流程。

如果该异常是已检查异常(即不是 Error 或 RuntimeException),则必须在 catch 块中捕获该异常,或在方法的签名中声明该方法应抛出该异常(或该异常的超类) )。就是这个throws IOException意思。

于 2015-01-07T11:12:26.487 回答
1

你说得很对。除了我稍后会提到的一件事。

throws 与名称和参数一样是方法 API 的一部分。客户知道如果他们调用了那个方法,他们需要处理那个异常——通过简单地也抛出它或者捕获它并处理它(这实际上可能需要抛出另一个包装原始异常的异常)。throws 在编译时处理。

throw 是让运行时知道发生了不好的事情的实际行为——我们担心的异常情况实际上已经发生了。所以需要在运行时处理。

但是,当您说“如果方法中存在 throw 语句,则应始终出现方法签名中的抛出”时,您并不完全正确。这通常是正确的,但并非总是如此。我还可以调用另一个在我的方法中抛出异常的方法,如果我没有捕获它,我的方法需要抛出它。在那种情况下,我没有明确抛出相同的异常。

最后一点是,您只需要在异常是已检查异常时在 throws 中声明一个异常——这意味着它来自 RuntimeException 的 Exception 类层次结构的另一端。常见的检查异常是 IOException 和 SQLException。如果您不自己处理检查的异常,则必须在方法签名的 throws 部分中列出它们。任何继承 RuntimeException 的东西——比如你的例子中的 NoSuchElementException 以及讨厌的 NullPointerException——都是未经检查的异常,不必被捕获或抛出或任何东西。

通常,您对可恢复的问题使用检查异常(客户端知道会发生什么并且可以优雅地处理问题并继续前进)和对灾难性问题(例如无法连接到数据库)使用未经检查的异常。

如果你能通过所有 AOP 的东西,是一个关于如何有效使用检查和未检查异常的精彩讨论。

于 2015-01-07T11:13:48.203 回答
1

第一个最大的区别是 throw 可以抛出异常,就像你在河里扔石头一样,并且 throws 状态这个方法有机会抛出异常但也可能不会......这就是为什么 throws 不需要 try catch 因为它已经声明它会抛出某种例外。

于 2015-01-07T11:16:51.803 回答
1

throws关键字意味着此方法将抛出任何必须在更高级别处理的异常。

public static void showMyName(String str) throws IOException

如果另一个方法调用此方法,它必须捕获此异常或再次抛出它(通过输入throws其签名)。

捕获异常或继续抛出异常,取决于您的业务逻辑。

于 2015-01-07T11:22:09.513 回答