环境Jbuilder9:
class Test {
public int devider(int x, int y) throws ArithmeticException,deviderbyMinException {
if (y < 0) {
throw new deviderbyMinException("devidor is min" + y);
}
int result = x / y;
return result;
}
}class deviderbyMinException extends Exception {
public deviderbyMinException(String mes) {
super(mes);
}
}class TestExcept {
public static void main(String args[]) { try {
System.out.println("ss11111111111111");
new Test().devider(8, -3);
}
catch (deviderbyMinException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
catch (Exception ex) {
System.out.println(ex.getMessage());
} System.out.println("programming is running here");
}
}
//////////////////
执行结果:
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)
ss11111111111111
devidor is min-3
programming is running here
我的疑问是:
1、
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)居然在我“执行异常前”就执行了,请大家看执行顺序:
System.out.println("ss11111111111111");
new Test().devider(8, -3);
2、如果我在
try {
System.out.println("ss11111111111111");
new Test().devider(8, -3);
}
catch (deviderbyMinException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();//注释掉这句
}
问题是: ex.printStackTrace();//注释掉这句怎么就不出现??
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)
class Test {
public int devider(int x, int y) throws ArithmeticException,deviderbyMinException {
if (y < 0) {
throw new deviderbyMinException("devidor is min" + y);
}
int result = x / y;
return result;
}
}class deviderbyMinException extends Exception {
public deviderbyMinException(String mes) {
super(mes);
}
}class TestExcept {
public static void main(String args[]) { try {
System.out.println("ss11111111111111");
new Test().devider(8, -3);
}
catch (deviderbyMinException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
catch (Exception ex) {
System.out.println(ex.getMessage());
} System.out.println("programming is running here");
}
}
//////////////////
执行结果:
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)
ss11111111111111
devidor is min-3
programming is running here
我的疑问是:
1、
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)居然在我“执行异常前”就执行了,请大家看执行顺序:
System.out.println("ss11111111111111");
new Test().devider(8, -3);
2、如果我在
try {
System.out.println("ss11111111111111");
new Test().devider(8, -3);
}
catch (deviderbyMinException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();//注释掉这句
}
问题是: ex.printStackTrace();//注释掉这句怎么就不出现??
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)
System.out.println("ss11111111111111");
new Test().devider(8, -3);
在执行new Test().devider(8, -3);的时候,由于你的devider(8, -3)方法中y的值小于0,所以 if (y < 0) {
throw new deviderbyMinException("devidor is min" + y);
}2:注释掉ex.printStackTrace();
ex.printStackTrace();是A 打印你的异常的跟踪异常的,有了就打印出deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23
来了我就是这样理解的,可能表达不清楚,见笑了
一。deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)居然在我“执行异常前”就执行了,请大家看执行顺序:
System.out.println("ss11111111111111");
new Test().devider(8, -3);这里虽然他打印的红字打印信息的上面,不代表他就先执行,因为他是异常处理的信息,也可以做个试验证明一下,下面我来多打印几条你看看就明白了(当然我说的也不一定对)
试验一:
public static void main(String args[]) {
System.out.println("ss11111111111111");//我把这一句放在try外面,以确保先执行
try {
new Test().devider(8, -3);
}
catch (deviderbyMinException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
输出信息:
Test$deviderbyMinException: devidor is min-3 at Test.devider(Test.java:7) at Test.main(Test.java:25)//可信息还是打在前面了ss11111111111111devidor is min-3programming is running here
试验二:
public static void main(String args[]) {
System.out.println("ss11111111111111");
try {
System.out.println("ss22222222222222");//增加的一条打印信息
new Test().devider(8, -3);
}
catch (deviderbyMinException ex) {
System.out.println("ss333333333333333");//再增加一条
System.out.println(ex.getMessage());
ex.printStackTrace();
}
输出结果:
Test$deviderbyMinException: devidor is min-3 at Test.devider(Test.java:7) at Test.main(Test.java:26)ss11111111111111ss22222222222222ss333333333333333devidor is min-3programming is running here
明显看出是按打印前后执行的。
通过以上两个小试验不难看出,其实他的执行顺序是没有变的,一样还是先执行System.out.println("ss11111111111111");和System.out.println("ss22222222222222");只不过在遇到异常处理时,系统会进行判断如果不是太大的错误不影响程序向下运行的话(也就是先打印出异常信息),再把开始要打应而没有打印的那句话ss11111111111111再打印出来,如果错误严重不能执行下面程序的时候就会先打印异常信息,再打印运行过但没有打印的信息而后面没有运行的代码不会再执行,中止程序(可以做个空指针异常试试)。二。ex.printStackTrace();这句话就是打印异常信息,你把这句话注释掉普通的异常信息当然不会打印出来了,但像空指针这样的严重错误信息一样会打印出来。不知道我这样理解对不对
语句:System.out.println("ss11111111111111");
new Test().devider(8, -3);
结果:
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)
ss11111111111111 /怎么也得这句作为“执行结果”应该在“异常的结果”“前面”才是符合源程序的????
我把程序单独用jdk编译运行,不会出现(第一种情况下):
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:23)
也就是证明了他不是我们的输出,是Jbuilder带出来的信息,但是为什么我注释掉:
ex.printStackTrace();Jbuilder也不出现 ex.printStackTrace()的信息,这个是很奇怪的,同样这个也是jbuilder自行处理的,他的内部机理我们不太清楚。谢谢qiang029(风),欢迎大家讨论。
ss11111111111111
devidor is min-3
programming is running here
testexception.deviderbyMinException: devidor is min-3
at testexception.Test.devider(TestException.java:7)
at testexception.TestExcept.main(TestException.java:30)
ss11111111111111是在前面阿
ss11111111111111
devidor is min-3
deviderbyMinException: devidor is min-3
at Test.devider(TestExcept.java:4)
at TestExcept.main(TestExcept.java:22)
programming is running here
难道使用的工具不同?