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分钟了)