Java中的异常和输出

Java中的异常和输出,java,exception,Java,Exception,我希望能够确定编译器何时抛出没有输出的异常,何时执行几行代码,然后执行异常 为了进一步说明我的观点,请考虑下面的代码: public class OverAndOver { static String s = ""; public static void main(String[] args) { try { s += "1"; throw new Exception(); } catch (Exception e) { s += "2

我希望能够确定编译器何时抛出没有输出的异常,何时执行几行代码,然后执行异常

为了进一步说明我的观点,请考虑下面的代码:

public class OverAndOver {
   static String s = "";
   public static void main(String[] args) {
     try {
       s += "1";
       throw new Exception();
     } catch (Exception e) { s += "2";
     } finally { s += "3"; doStuff(); s += "4";
     }
     System.out.println(s);
   }
   static void doStuff() { int x = 0; int y = 7/x; }
 }
快速浏览doStuff()方法,您就会知道编译器将抛出一个被零除的异常

现在,我的问题是(也是我困惑的根源):为什么编译器没有显示“123”后跟异常?最重要的是,我怎样才能确定编译器何时在抛出异常之前执行几行代码,以及何时在没有输出的情况下立即抛出异常

为什么编译器没有显示“123”后跟异常

首先,编译器不会执行代码,因此它永远不会显示这些值

如果你想知道为什么你的应用程序在异常之前没有显示文本,答案是你没有打印它:你只是将它附加到一个字符串,然后在
finally
块之后打印字符串

finally
块抛出异常,您的打印语句将永远无法到达

尝试直接打印文本:

public class OverAndOver {

    public static void main(String[] args) {
        try {
            System.out.println("1");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("2");
        } finally {
            System.out.println("3");
            doStuff();
            System.out.println("4");
        }
    }

    static void doStuff() {
        int x = 0;
        int y = 7 / x;
    }
}
输出将是:

1
2
3
Exception in thread "main" 
java.lang.ArithmeticException: / by zero
    at com.jedisoftware.lf_delivery_tracking.OverAndOver.doStuff(App.java:74)
    at com.jedisoftware.lf_delivery_tracking.OverAndOver.main(App.java:67)
为什么编译器没有显示“123”后跟异常

因为
System.out.println(s)指令永远不会执行。。在
doStuff()中引发异常方法,并且主方法的执行被中断。
如果要在异常之前显示
123
,则应将
System.out.printlndoStuff()
方法前的code>指令如下:

public class OverAndOver {
   static String s = "";
   public static void main(String[] args) {
     try {
       s += "1";
       throw new Exception();
     } catch (Exception e) { s += "2";
     } finally { s += "3"; System.out.println(s); doStuff(); s += "4";
     }
   }
   static void doStuff() { int x = 0; int y = 7/x; }
 }
您可以调用
doStuff()
,这可能会在try块之外抛出未经检查的异常。如果要同时打印异常和字符串,必须将
doStuff()
调用包装在try-catch构造中

public class OverAndOver {
   static String s = "";
   public static void main(String[] args) {
     try {
       s += "1";
       throw new Exception();
     } catch (Exception e) { s += "2";
     } finally {
        try{
          s += "3"; doStuff(); s += "4";
       }catch(ArithmeticException e){
         e.printStackTrace();
       }
     }
     System.out.println(s);
   }
   static void doStuff() { int x = 0; int y = 7/x; }
 }

旁白:您可能是指运行时环境,编译器不会执行您的代码。谢谢您的更正+谢谢你的精彩解释。我试图接受你的帖子作为回答,但它不允许我这样做。我稍后再试。再一次,非常感谢。最后一个问题:Java中是否存在任何异常,无论您的代码如何,运行时环境只抛出异常而没有输出?@JesseJames Java与任何其他语言一样:它完全按照您的要求执行。如果未捕获并处理异常,异常将中断程序的执行,但它们不会“擦除”程序输出。在异常打印之前打印的所有内容。@JesseJames关于接受答案,您需要等待一定时间才能接受答案(我想您发布问题大约15分钟了)