我希望能够确定编译器何时抛出异常没有输出以及何时执行几行代码后跟异常。
为了进一步说明我的观点,请考虑以下代码:
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”后跟异常?最重要的是,我怎样才能确定编译器何时在抛出异常之前执行几行代码以及何时立即抛出异常而没有输出?
答案 0 :(得分:3)
为什么编译器没有显示“123”后跟异常?
首先,编译器不执行代码,因此它永远不会显示这些值。
如果您想知道为什么您的应用在异常之前没有显示文本,答案是您没有打印它:您只需将其附加到字符串,然后在 > finally
块。
finally
块抛出异常,永远不会到达print语句。
尝试直接打印文字:
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)
答案 1 :(得分:1)
为什么编译器没有显示" 123"然后是例外?
因为永远不会执行System.out.println(s);
指令。doStuff();
方法会引发异常,并且主方法的执行被中断。
如果要在异常之前显示123
,则应将System.out.println(s);
指令放在doStuff()
方法之前,如下所示:
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; }
}
答案 2 :(得分:1)
您调用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; }
}