Java 抛出和抛出异常之间有什么区别?为什么“抛出”不需要捕捉/最终阻挡?

Java 抛出和抛出异常之间有什么区别?为什么“抛出”不需要捕捉/最终阻挡?,java,exception,exception-handling,throw,throws,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 bl

我在下面的片段中有点困惑

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")
   }
现在,我的问题是抛出IOException和抛出newioexception之间的区别是什么

为什么我们不要求为抛出IOException使用catch,finally block呢

抛出是如何处理异常的

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


如果该异常是已检查的异常,即不是错误或RuntimeException,则必须在catch块中捕获该异常,或者在方法的签名中声明该方法预期引发该异常或该异常的超类。这就是抛出IOException的意思。

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

抛出与名称和参数一样是方法API的一部分。客户机知道,如果调用该方法,他们需要通过简单地抛出异常或捕获异常并进行处理来处理异常,这实际上可能需要抛出另一个封装原始异常的异常。抛出在编译时处理

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

但是你说的不是很对,如果方法中存在throw语句,那么throw-in方法签名应该总是出现。这通常是正确的,但并不总是正确的。我还可以调用另一个在我的方法中抛出异常的方法,如果我没有捕获它,我的方法需要抛出它。在这种情况下,我不会显式抛出相同的异常

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

通常,对于可恢复的问题,客户机知道会发生什么,可以优雅地处理问题,然后继续,对于灾难性问题,如无法连接到数据库,则使用检查异常


如果你能克服所有AOP的东西,这将是一次关于如何有效使用检查和未检查异常的伟大讨论。

第一个最大的区别是抛出可以抛出异常,就像你在河里扔石头一样, 和throws表示此方法有机会抛出异常,但也可能不会。。。这就是为什么throws不需要try-catch,因为它已经声明它将抛出某种异常。

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

公共静态void showMyNameString str引发IOException

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

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

生成异常时,有两种处理方法

处理异常-这使用catch块 声明异常-这使用抛出块 因此,处理已经生成的异常是由catch或throws完成的

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

通常,在实例化异常对象或将已生成的异常级联到调用方时,会使用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块中的代码总是被执行——即使try或catch有一个return语句。 throw-用于通过调用方法推送或级联异常。总是在方法内部使用。 throws-用于声明如果出现错误,方法将抛出异常。始终用作方法签名的一部分。 附加阅读

帮助您理解java中的try-catch-finally语义

更新

回答你的另一个问题 离子

为什么我们不要求使用接球,最后拦网来投掷 例外

将捕获和抛出视为相互排斥的构造。这并不总是正确的,但是对于你的理解来说,从这个想法开始是很好的

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

抛出是如何处理异常的


正如我前面提到的,catch和finally在异常处理期间使用。throws只是用来将异常级联回调用方。

你最好用谷歌搜索这类事情。实际上,throws不处理异常,而是在更高级别上进行委托以被捕获。我用谷歌搜索它,但我的查询仍然无法解决。这就是为什么我选择堆栈溢出来获得好结果@DarshanLiladid你只是在try-catch块中放了一个方法:-o?@bigdestroyer是的,没错,我想知道详细流程。如何处理投掷。