【问题标题】:Console output before runtimeexception is thrown抛出运行时异常之前的控制台输出
【发布时间】:2020-03-06 15:28:06
【问题描述】:

我们有两个相似的代码,它们都会导致 RunTimeException。但是,其中一个代码将打印出结果+异常,而另一个代码仅在没有结果的情况下抛出异常,直到抛出异常为止。你可以在这里看到这两个代码块,其中一个被注释掉了:

第一种情况:

public class ExceptionTest {

 public static void main(String[] args) {
    String letters = "abcdef";

    System.out.println(letters.length());
    System.out.println(letters.charAt(3));
    System.out.println(letters.charAt(6));

 }
}

第二种情况:

public class ExceptionTest {

 public static void main(String[] args) {
    int total = 0;
    StringBuilder letters = new StringBuilder ("abcdefgh");
    total += letters.substring(1, 2).length();
    total += letters.substring(6, 6).length();
    total += letters.substring(6, 5).length();

    System.out.println(total);

 }
}

谁能解释为什么它只会打印 RuntimeException 而不会在注释代码块中包含结果?

【问题讨论】:

  • 在第一个 sn-p 中,您在每一行中打印一些值。在第二个中,在所有操作完成后,您只尝试对其进行一次打印。其中一项操作会引发异常,因此永远不会到达 print 语句。

标签: java runtimeexception


【解决方案1】:

输出来自 System.out.println()。 在注释掉的版本中,我认为异常是由 substring(6,5) 引起的,并且出现在 println() 之前。

【讨论】:

    【解决方案2】:
        String letters = "abcdef";
    
        System.out.println(letters.length());
        System.out.println(letters.charAt(3));
        System.out.println(letters.charAt(6)); // <--- fails
    

    在执行System.out.println(letters.length());System.out.println(letters.charAt(3)); 之后,此代码在注释行失败。所以你可以看到这两个输出。

    int total = 0;
    
    StringBuilder letters = new StringBuilder ("abcdefgh");
    
    total += letters.substring(1, 2).length();
    total += letters.substring(6, 6).length();
    total += letters.substring(6, 5).length(); //<-- fails
    
    System.out.println(total);
    

    这段代码在System.out.println(total);之前失败,所以没有输出

    【讨论】:

    • 感谢所有回复的人。你所有的答案都有道理!应该自己捡起来的:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2012-08-21
    • 2015-06-03
    相关资源
    最近更新 更多