【问题标题】:Question about program flow when throwing and rethrowing exception with finally block [duplicate]关于使用finally块抛出和重新抛出异常时的程序流程问题[重复]
【发布时间】:2021-06-15 06:01:31
【问题描述】:
public class UsingExceptions {

    public static void main(String[] args) {
        try{
            throwException();
        }
        catch(Exception e){
            System.err.println("Exception handled in main");
        }
        doesNotThrowException();
    }

    public static void throwException()throws Exception{
        try{
            System.out.println("Method throwException");
            throw new Exception();
        }
        catch(Exception e){
            System.err.println("Exception Handled in Method throwExceptioin ");
            throw e;
        }
        finally{
            System.err.println("Finally executed in method throwException");
        }
    }

    public static void doesNotThrowException(){
        try{
            System.out.println("Method doesNotThrowException");
        }
        catch(Exception e){
            System.err.println("Exception handled in method doesNotThrowException");
        }
        finally{
            System.out.println("finally executed in doesNotThrowException");
        }
        System.out.println("end of method doesNotThrowException");
    }
}

我的 IDE 正在输出:

  • 方法 throwException
  • 在 throwExceptioin 方法中处理的异常
  • 方法不抛出异常
  • 最终在throwException方法中执行
  • 在 main 中处理异常
  • 最终在doesNotThrowException中执行
  • doesNotThrowException 方法结束

但我期待:

  • 方法 throwException
  • 在 throwException 方法中处理的异常
  • 最终在 throwException 中执行
  • 在 main 中处理异常
  • 方法不抛出异常
  • 最终在doesNotThrowException中执行
  • doesNotThrowException 方法结束

我的问题在哪里?

【问题讨论】:

    标签: java exception try-catch finally


    【解决方案1】:

    代码有多个输出。

    用eclipse编译:

    Exception Handled in Method throwExceptioin 
    Method throwException
    Finally executed in method throwException
    Exception handled in main
    Method doesNotThrowException
    finally executed in doesNotThrowException
    end of method doesNotThrowException
    

    通过 Windows cmd.exe 使用标准 javac 编译器编译:

    Method throwException
    Exception Handled in Method throwExceptioin
    Finally executed in method throwException
    Exception handled in main
    Method doesNotThrowException
    finally executed in doesNotThrowException
    end of method doesNotThrowException
    

    使用 IntelliJ IDEA 编译:

    Method throwException
    Method doesNotThrowException
    finally executed in doesNotThrowException
    end of method doesNotThrowException
    Exception Handled in Method throwExceptioin 
    Finally executed in method throwException
    Exception handled in main
    

    作为用户 Sorin 声明。 IDE 以不同的方式处理打印到控制台。 IntelliJ IDEA 首先输出所有System.out.println(),然后输出所有System.err.println()。标准的 java 编译器以预期的顺序将它们线程化,并以某种奇怪的顺序进行 eclipse。

    如果您想要在每个 IDE 中使用您所期望的代码,则必须只使用 System.out.println() 或只使用 System.err.println()。你也可以看看this answer

    【讨论】:

    • 虽然您的帮助意图得到确认,但这并不是问题的答案。这也是因为 OP 同时使用了 System.out 和 System.err,IDE(至少 IntelliJ)按自己的顺序处理。
    • 我会写评论,但我无法在其他人的帖子下发表评论(因为我的声誉),但我仍然想发布我拥有的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多