环境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)

解决方案 »

  1.   

    1:
    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
    来了我就是这样理解的,可能表达不清楚,见笑了
      

  2.   

    我谈一下我的看法
    一。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();这句话就是打印异常信息,你把这句话注释掉普通的异常信息当然不会打印出来了,但像空指针这样的严重错误信息一样会打印出来。不知道我这样理解对不对
      

  3.   

    谢谢,但是我觉得你对第一个问题的解答没有说清楚,我是说执行结果为什么和语句的执行的顺序相反:
    语句: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  /怎么也得这句作为“执行结果”应该在“异常的结果”“前面”才是符合源程序的????
      

  4.   

    我说的话是对“huataixiang19810225(无名)  ”而言的
      

  5.   

    我觉得qiang029(风)说得是对的:
    我把程序单独用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(风),欢迎大家讨论。
      

  6.   

    我用Eclipse打出来的时这样的
    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是在前面阿
      

  7.   

    但用UtralEdit打出来的是这样的
    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
    难道使用的工具不同?