抛出和抛出异常有什么区别?为什么"抛出"不需要捕获/最终阻止?

时间:2015-01-07 11:09:56

标签: java exception exception-handling throw throws

我在下面的代码片段中有点混乱。

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 && 抛出新IOException

为什么我们不需要使用catch,最后阻止抛出IOException

throws 如何处理异常。 ?

5 个答案:

答案 0 :(得分:2)

生成Exception时,有两种方法可以处理它。

  1. 处理异常 - 这使用catch阻止
  2. 声明异常 - 这使用throws阻止
  3. 因此,处理已生成的异常是由catchthrows完成的。

    另一方面,throw用于生成异常""。

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

    例如,

    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 - 在trycatch阻止后立即使用。可选的。用于执行"必须"被执行。即使finallytrycatch声明,return总是内的代码也会被执行。
    • throw - 用于"推送"或"级联"通过调用方法的异常。始终在方法中使用。
    • throws - 用于"声明"如果出现问题,方法将抛出异常。始终用作方法签名的一部分。

    地方阅读

    Here's an elaborate article帮助您理解java中的try-catch-finally语义。

    <强>更新

    要回答您的其他问题,

      

    为什么我们不要使用catch,最后阻止抛出   IOException?

    catchthrows视为互斥结构。 (这并非总是如此,但为了您的理解,从这个想法开始是件好事。)

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

      

    throws如何处理异常。 ?

    就像我之前提到的那样,在异常处理期间使用了catchfinallythrows仅用于将异常级联回调用者。

答案 1 :(得分:1)

throw new IOException表示您遇到了一些错误情况,并决定通过抛出异常来打破程序流。

如果该异常是一个已检查的异常(即不是Error或RuntimeException),则必须在catch块中捕获该异常,或者在方法的签名中声明该方法应该抛出该异常(或者超常的那种例外)。这就是throws IOException的含义。

答案 2 :(得分:1)

你非常正确。除了一件事,我稍后会提到。

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

扔掉是让运行时知道发生了不好事情的实际行为 - 我们担心的特殊情况实际上已经发生了。所以它需要在运行时处理。

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

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

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

如果您可以通过所有AOP内容,this就如何有效地使用已检查和未检查的异常进行了很好的讨论。

答案 3 :(得分:1)

第一个最大的区别是投掷可以像你在河里扔石头一样抛出异常, 并抛出这个方法有机会抛出异常,但可能也没有...这就是为什么抛出不需要尝试catch因为它已经表明它会抛出某种异常。

答案 4 :(得分:1)

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

public static void showMyName(String str) throws IOException

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

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