黑马程序员技术交流社区

标题: 关于异常的小问题 [打印本页]

作者: 黑马李昂    时间: 2013-8-1 23:18
标题: 关于异常的小问题
本帖最后由 杨兴庭 于 2013-8-2 18:52 编辑
  1. import java.util.Scanner;

  2. class LanPingException extends Exception {

  3.         LanPingException(String message) {
  4.                 super(message);
  5.         }
  6. }

  7. class MaoYanException extends Exception {

  8.         MaoYanException(String message) {
  9.                 super(message);
  10.         }
  11. }

  12. class StopException extends Exception {
  13.         StopException(String message) {
  14.                 super(message);
  15.         }
  16. }

  17. class Computer {
  18.         private Scanner s;

  19.         public void open() throws LanPingException, MaoYanException {
  20.                 System.out.println("老师打开电脑!会出现哪种情况?请输入0-2的数字");
  21.                 s = new Scanner(System.in);
  22.                 int status = s.nextInt();
  23.                 if (status == 0) {
  24.                         System.out.println("开机正常,老师开机上课了!");
  25.                 } else if (status == 1) {
  26.                         throw new LanPingException("出现蓝屏情况!");
  27.                 } else {
  28.                         throw new MaoYanException("出现冒烟情况!");
  29.                 }
  30.         }

  31.         public void reset() {
  32.                 System.out.println("电脑重启了");
  33.         }
  34. }

  35. class Teacher {
  36.         private String name;
  37.         Computer c;

  38.         Teacher(String name) {
  39.                 this.setName(name);
  40.                 c = new Computer();
  41.         }

  42.         public void teach() throws StopException {
  43.                 try {
  44.                         c.open();
  45.                 } catch (LanPingException e) {
  46.                         System.out.println(e.toString());
  47.                         c.reset();
  48.                         teach();
  49.                 } catch (MaoYanException e) {
  50.                         throw new StopException("课程无法继续");
  51.                 }
  52.         }

  53.         public void lianxi() {
  54.                 System.out.println("同学做课堂练习!");
  55.         }

  56.         public String getName() {
  57.                 return name;
  58.         }

  59.         public void setName(String name) {
  60.                 this.name = name;
  61.         }
  62. }

  63. class Demo {
  64.         public static void main(String[] args)  {
  65.                 Teacher t = new Teacher("xiaoqiang");
  66.                 try {
  67.                         t.teach();
  68.                 } catch (StopException e) {
  69.                         e.printStackTrace();
  70.                         t.lianxi();
  71.                 }
  72.         }
  73. }
复制代码
如果是status ==2的情况,观察输出打印的的结果发现:调用t.lianxi();方法的结果比
e.printStackTrace();的结果先打印出来,为什么?这是java虚拟机运行的固定机制吗?
求指教{:soso_e100:}
作者: 黄兴旺    时间: 2013-8-1 23:22
学习学习...
作者: 白堇翎    时间: 2013-8-1 23:57
能帮班长同学解答问题很荣幸啊...哈哈哈不说废话了

如果在try语句快中的任何代码抛出了一个在catch字句中说明的异常类,那么程序将跳过try语句快中的其余代码直接执行catch字句中的处理器代码.
这里你的t.lianxi();的输出流是system.out,而printStackTrace(); API里描述的输出至错误输出流(System.err)

System.out和System.err的区别:
System.err  
  “标准”错误输出流。此流已打开并准备接受输出数据.
       

  System.out  
  “标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。


system.err是需要缓冲,并且不是被连续监视的,你遇到的这种情况应该属于个例,多实验几次应该就会出现先打印异常信息的情况...


比如我把你的代码复制到我电脑上..每次都是先打印错误信息 然后才打印同学们继续练习..

作者: 黑马李昂    时间: 2013-8-2 00:10
白堇翎 发表于 2013-8-1 23:57
能帮班长同学解答问题很荣幸啊...哈哈哈不说废话了

如果在try语句快中的任何代码抛出了一个在catch字句中 ...

是不是说跟java虚拟机运行线程机制有关系呢?
陈兄,你真是太客气了!看到你上次参加版主活动名列前茅,真心佩服啊!技术储备好强的啊,有木有,望今后不吝赐教啊{:soso_e100:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2