【问题标题】:java try catch when is the program flow interrupted?java try catch 程序流程何时中断?
【发布时间】:2014-11-18 12:24:42
【问题描述】:

您好,我对 Java 中的异常处理不太熟悉,所以: 正如主题在基本 try/catch 块中所说,当我在 Try 块中捕获异常时,程序流何时中断?

try{
    //some code that raises an Exception
}catch(Exception e){
    // react to interrupt or continue program flow
}finally{
    // always done after the catch
}
//when is this code executed?

finally 语句总是在 try catch 之后执行,那么在 catch 部分必须做什么才能中断程序或让程序继续执行?

【问题讨论】:

  • 好在发生异常的时候会被中断。
  • 程序不会终止,即使抛出异常也会继续执行。所以 ans is 程序不会被终止。
  • 在catch块中你需要处理try块抛出的异常,否则它不会被执行。如果您在不抛出 catch 块的情况下抑制异常,则程序将继续。

标签: java try-catch


【解决方案1】:

当任何地方发生任何异常时,指令流被中断。

如果异常发生在 try 范围内,并且异常类“可分配给”catch 子句中指定的类,则控制权为转移到 catch 块的开头。 (如果异常类不是“可分配的”,那么异常只会“冒泡”到下一个外部 try 块或线程 EH。)

如果catch 块没有引发异常(或重新引发原始异常),则该异常被视为“已处理”,并在该trycatch 子句列表之后立即继续执行。这可能意味着流进入finally 块,然后在finally 的末尾继续。

如果未捕获异常,或者在catch 块中(重新)发出异常信号,则在异常“冒泡”之前执行任何后续finally 块。

如果在trycatch 块中执行return,则任何finally 都会在return 生效之前执行。

【讨论】:

    【解决方案2】:

    如果你在catch块中捕获了异常,并且finally块没有抛出任何异常,那么finally块之后的语句将在finally块执行后立即执行。

    如果你没有在catch块中捕获异常,或者你在catch块或finally块中抛出了一个新的异常,finally块之后的语句将不会被执行,下一个代码将被执行execute 是可以处理抛出的异常的最直接封闭的 catch 块。

    【讨论】:

      【解决方案3】:

      Catch() 块用于通知/处理异常。

      引用自文档,

      catch 块包含当 异常处理程序被调用。运行时系统调用异常 当处理程序是调用堆栈中的第一个 ExceptionType 匹配抛出的异常的类型。系统 如果抛出的对象可以合法地分配给它,则认为它是匹配的 异常处理程序的参数。

      正如主题中所说的那样 try/catch 块,当我在 Try 块中捕获异常时,程序流程是什么时候 被打断了?

      Catch 块用于处理异常。所以如果没有错误Catch块不会被执行,但是finally()会被执行

      【讨论】:

      • 仔细阅读问题
      • @kocko 我猜他很困惑,用代码看问题是不同的
      【解决方案4】:
      try {
                  System.out.println("Throw exception");
                  int i = 5/0;
              } catch (Exception e) {
                  // TODO: handle exception
                  System.out.println(e.getMessage());
                  e.printStackTrace();
              }finally{
      
              System.out.println("Doubt solved if line prints");
      
          }
      
              System.out.println("After exception");
      

      这里的代码你自己试试,我认为在执行这个之后不需要解释,直到发生异常它会直接进入 catch,即使这样它也会去执行 finally,然后是进一步的代码.

      【讨论】:

        【解决方案5】:

        执行以下代码以了解异常的异常流程。

        try {
              //line 1
              //line 2
              throw new Exception(); //line 3
              // line 4
              // line 5 
            } catch (Exception e) {
             // if exception occur at line 3, line 4 & 5 will not executed because of interrupt in execution flow.
             // since your program is interrupted when exception occur.
             System.out.println("Catch block will execute after exception !");
        
            }finally{
                System.out.println("Finally block will execute after exception !");
            }
        
            // your program will continue its execution.
            System.out.println("Code after the finally block also exectute after the exception !");
        

        输出

        Catch block will execute after exception !
        Finally block will execute after exception !
        Code after the finally block also exectute after the exception !
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多