黑马程序员技术交流社区

标题: 求大神看看这段代码怎么改 [打印本页]

作者: 小黑子    时间: 2014-8-20 16:20
标题: 求大神看看这段代码怎么改
/*
需求:老师调用电脑上课,电脑可能出现蓝屏或冒烟异常
当电脑蓝屏时,需重启电脑
当电脑冒烟时,需运用课时无法进行异常解决
*/
现在想要让电脑重启后,继续调用run() , 可是调用run()又需对异常进行抛出或声
这样问题就来了:
1、 如果蓝屏这个问题,需要在函数内部解决,不希望被抛出,代码应该怎么写?
2、如果蓝屏主个问题,可以抛出,由调用者解决,那应该怎么写?
==================程序代码=========================
class Teacher6
{
        String name;
        Computer6 cmpt;
        Teacher6(String name)
        {
                this.name = name;
        }
        //讲课
        public void prelect() throws NoPlanException,
        {
                try
                {
                        cmpt = new Computer6();
                        cmpt.run();
                }
                catch (LanPingException6 e)
                {
                        cmpt.reset();
                        cmpt.run();//异常需被抛出或声明
                }
                catch(MaoYanException6 e)
                {
                        throw new NoPlanException("换电脑");
                }
                System.out.println("老师讲课");
        }
}

class Computer6
{
        private int status = 2;
        //电脑运行
        public void run() throws LanPingException6,MaoYanException6
        {
                if (status==2)
                        throw new LanPingException6("电脑蓝屏了!");
                if(status==3)
                        throw new MaoYanException6("电脑冒烟了!");
                System.out.println("电脑运行");
        }
        //电脑重启
        public void reset()
        {
                System.out.println("电脑重启");
                status = 1;
        }
}
//蓝屏异常
class LanPingException6 extends Exception
{
        LanPingException6(String msg)
        {
                super(msg);
        }
}
//冒烟异常
class MaoYanException6 extends Exception
{
        MaoYanException6(String msg)
        {
                super(msg);
        }
}
//课时无法进行异常
class NoPlanException6 extends Exception
{
        NoPlanException6(String msg)
        {
                super(msg);
        }
}

class ExceptionDemo6
{
        public static void main(String[] args)
        {
                Teacher6 t = new Teacher6("qu");
                try
                {
                        t.prelect();
                }
                catch (NoPlanException e)
                {
                        System.out.println(e.toString());
                }
                System.out.println("Hello World!");
        }
}

==========================运行截图=========================



异常代码4.png (9.28 KB, 下载次数: 18)

4

4

异常代码3.png (16.24 KB, 下载次数: 18)

3

3

异常代码2.png (15.2 KB, 下载次数: 20)

异常代码2.png

异常代码1.png (107.47 KB, 下载次数: 14)

异常代码1.png

作者: 小黑子    时间: 2014-8-21 08:59
为啥浏览量是0???顶起来&&求大神
作者: 付江涛    时间: 2014-8-21 09:59
函数内部解决就是try
由调用者解决就是抛
作者: a6511631    时间: 2014-8-21 10:14
第一种情况,对run()方法进行try
  1. try
  2.                 {
  3.                         cmpt = new Computer();
  4.                         cmpt.run();
  5.                 }
  6.                 catch (LanPingException e)
  7.                 {
  8.                         cmpt.reset();
  9.                         try {
  10.                                                         cmpt.run();
  11.                                                 } catch (LanPingException e1) {
  12.                                                         e1.printStackTrace();
  13.                                                 } catch (MaoYanException e1) {
  14.                                                         e1.printStackTrace();
  15.                                                 }//异常需被抛出或声明
  16.                 }
  17.                 catch(MaoYanException e)
  18.                 {
  19.                         throw new NoPlanException("换电脑");
  20.                 }
  21.                 System.out.println("老师讲课");
复制代码

第二种,直接在函数声明上抛出
  1. public void prelect() throws NoPlanException, LanPingException, MaoYanException
复制代码

其实你的问题在eclipse中按下ctrl+1快速修复提示,是几秒钟的事情。你去尝试用eclipse这样的IDE吧
作者: 小黑子    时间: 2014-8-22 11:09
a6511631 发表于 2014-8-21 10:14
第一种情况,对run()方法进行try

第二种,直接在函数声明上抛出

第一种情况:
      你提出的这种做法,我也想到了。但现在才是我真正要问的问题:
       1、运行cmpt.reset()之后,再运行cmpt.run(),如果再次出现 蓝屏问题,你的做法是将问题打印,而不是重启电脑,但这就违背了蓝屏可以通过重启电脑解决的原则,
      2、可是,如果捕捉到蓝屏问题后,不打印,而是通过重启电脑,然后再调用run()来解决。这样调用run()还是可能出现蓝屏,又得重启电脑,调用run()………………这样就会陷入一个无限循环的状态,代码就会限长。
     有没有什么办法,即可以通过内容调用reset()解决蓝屏,再调用run(),而又不会陷入死循环呢?
第二种:
    不知道你运行了没有,如果直接在函数是声明LanPingException6,而函数体内的代码不做改动的话,编译是无法参通过的。那函数体内代码应该怎么改呢?
作者: 小黑子    时间: 2014-8-22 11:13
付江涛 发表于 2014-8-21 09:59
函数内部解决就是try
由调用者解决就是抛

伟大滴版主!现在只是抛砖引玉。
你看看我楼下的回答,和我给楼下的回复,那才是我真正的问题
看看这问题到底该如何解决:'(
作者: icris    时间: 2014-8-22 11:37
小黑子 发表于 2014-8-22 11:09
第一种情况:
      你提出的这种做法,我也想到了。但现在才是我真正要问的问题:
       1、运行cmpt.r ...

外层套上 while(true) 或 for(;;) ,运行结束加上 break;
有异常就会循环回去,没异常就 break 了
作者: a6511631    时间: 2014-8-22 14:52
小黑子 发表于 2014-8-22 11:09
第一种情况:
      你提出的这种做法,我也想到了。但现在才是我真正要问的问题:
       1、运行cmpt.r ...

那就用递归吧,在catch中打印异常信息后继续调用自身方法。
你看看我的涂鸦之作
  1. class Teacher6
  2. {
  3.         String name;
  4.         Computer cmpt;
  5.         Teacher6(String name)
  6.         {
  7.                 this.name = name;
  8.         }
  9.         //讲课
  10.         public void prelect(Computer cmpt) throws NoPlanException
  11.         {
  12.                 try
  13.                 {
  14.                         cmpt.run();
  15.                 }
  16.                 catch (LanPingException e)
  17.                 {
  18.                         cmpt.reset();
  19.                         try {
  20.                                                         cmpt.run();
  21.                                                 } catch (LanPingException e1) {
  22.                                                         e1.printStackTrace();
  23.                                                         prelect(cmpt);
  24.                                                 } catch (MaoYanException e1) {
  25.                                                         e1.printStackTrace();
  26.                                                 }//异常需被抛出或声明
  27.                 }
  28.                 catch(MaoYanException e)
  29.                 {
  30.                         throw new NoPlanException("换电脑");
  31.                 }
  32.                 System.out.println("老师讲课");
  33.         }
  34. }

  35. class Computer
  36. {
  37.         private int status = 2;
  38.         //电脑运行
  39.         public void run() throws LanPingException,MaoYanException
  40.         {
  41.                 if (status==2)
  42.                         throw new LanPingException("电脑蓝屏了!");
  43.                 if(status==3)
  44.                         throw new MaoYanException("电脑冒烟了!");
  45.                 System.out.println("电脑运行");
  46.         }
  47.         //电脑重启
  48.         public void reset()
  49.         {
  50.                 System.out.println("电脑重启");
  51.                 status = 1;
  52.         }
  53. }
  54. //蓝屏异常
  55. class LanPingException extends Exception
  56. {
  57.         LanPingException(String msg)
  58.         {
  59.                 super(msg);
  60.         }
  61. }
  62. //冒烟异常
  63. class MaoYanException extends Exception
  64. {
  65.         MaoYanException(String msg)
  66.         {
  67.                 super(msg);
  68.         }
  69. }
  70. //课时无法进行异常
  71. class NoPlanException extends Exception
  72. {
  73.         NoPlanException(String msg)
  74.         {
  75.                 super(msg);
  76.         }
  77. }

  78. class ExceptionDemo6
  79. {
  80.         public static void main(String[] args)
  81.         {
  82.                 Teacher6 t = new Teacher6("qu");
  83.                 Computer cmpt = new Computer();
  84.                 try
  85.                 {
  86.                         t.prelect(cmpt);
  87.                 }
  88.                 catch (NoPlanException e)
  89.                 {
  90.                         System.out.println(e.toString());
  91.                 }
  92.                 System.out.println("Hello World!");
  93.         }
  94. }
复制代码

作者: happymouse    时间: 2014-8-22 18:17
小黑子 发表于 2014-8-22 11:09
第一种情况:
      你提出的这种做法,我也想到了。但现在才是我真正要问的问题:
       1、运行cmpt.r ...

对于第一种情况,按照LZ的思路无限重启是可能的,但是这是设计代码不合理导致的,其实重启是一个动作包括关闭和启动,应该全部由reset()函数完成。这样才符合面向对象的思想。
对于第二种情况,对于不想处理的异常应该抛出并声明,由调用者解决
作者: 小黑子    时间: 2014-8-23 09:09
icris 发表于 2014-8-22 11:37
外层套上 while(true) 或 for(;;) ,运行结束加上 break;
有异常就会循环回去,没异常就 break 了 ...

小生愚钝,想不出具体代码怎么实现,求大神指教
作者: 小黑子    时间: 2014-8-23 09:24
a6511631 发表于 2014-8-22 14:52
那就用递归吧,在catch中打印异常信息后继续调用自身方法。
你看看我的涂鸦之作
...

大神,我觉得把你的19到26行换成我这样,是不是会更好一些?
  1. class Teacher6
  2. {
  3.         String name;
  4.         Computer cmpt;
  5.         Teacher6(String name)
  6.         {
  7.                 this.name = name;
  8.         }
  9.         //讲课
  10.         public void prelect(Computer cmpt) throws NoPlanException
  11.         {
  12.                 try
  13.                 {
  14.                         cmpt.run();
  15.                 }
  16.                 catch (LanPingException e)
  17.                 {
  18.                                         cmpt.reset();
  19.                                                 try
  20.                                                 {
  21.                                                         prelect(cumpt);
  22.                                                 }
  23.                                                 catch (NoPlanException e)
  24.                                                 {
  25.                                                          System.out.println(e.toString());
  26.                                                 }
  27.                                              
  28.                 }
  29.                 catch(MaoYanException e)
  30.                 {
  31.                         throw new NoPlanException("换电脑");
  32.                 }
  33.                 System.out.println("老师讲课");
  34.         }
  35. }

  36. class Computer
  37. {
  38.         private int status = 2;
  39.         //电脑运行
  40.         public void run() throws LanPingException,MaoYanException
  41.         {
  42.                 if (status==2)
  43.                         throw new LanPingException("电脑蓝屏了!");
  44.                 if(status==3)
  45.                         throw new MaoYanException("电脑冒烟了!");
  46.                 System.out.println("电脑运行");
  47.         }
  48.         //电脑重启
  49.         public void reset()
  50.         {
  51.                 System.out.println("电脑重启");
  52.                 status = 1;
  53.         }
  54. }
  55. //蓝屏异常
  56. class LanPingException extends Exception
  57. {
  58.         LanPingException(String msg)
  59.         {
  60.                 super(msg);
  61.         }
  62. }
  63. //冒烟异常
  64. class MaoYanException extends Exception
  65. {
  66.         MaoYanException(String msg)
  67.         {
  68.                 super(msg);
  69.         }
  70. }
  71. //课时无法进行异常
  72. class NoPlanException extends Exception
  73. {
  74.         NoPlanException(String msg)
  75.         {
  76.                 super(msg);
  77.         }
  78. }

  79. class ExceptionDemo6
  80. {
  81.         public static void main(String[] args)
  82.         {
  83.                 Teacher6 t = new Teacher6("qu");
  84.                 Computer cmpt = new Computer();
  85.                 try
  86.                 {
  87.                         t.prelect(cmpt);
  88.                 }
  89.                 catch (NoPlanException e)
  90.                 {
  91.                         System.out.println(e.toString());
  92.                 }
  93.                 System.out.println("Hello World!");
  94.         }
  95. }
复制代码

作者: lfs454766767    时间: 2014-8-23 09:37
看着挺难得啊!真心不会啊
作者: 戏言丶    时间: 2014-8-23 11:16
我是来学习的
作者: icris    时间: 2014-8-23 12:26
小黑子 发表于 2014-8-23 09:09
小生愚钝,想不出具体代码怎么实现,求大神指教
  1.         // 讲课
  2.         public void prelect() throws NoPlanException6 {
  3.                 cmpt = new Computer6();
  4.                 while (true) {
  5.                         try {
  6.                                 cmpt.run();
  7.                                 break;
  8.                         } catch (LanPingException6 e) {
  9.                                 cmpt.reset();
  10.                         } catch (MaoYanException6 e) {
  11.                                 throw new NoPlanException6("换电脑");
  12.                         }
  13.                 }
  14.                 System.out.println("老师讲课");
  15.         }
  16. }
复制代码

这样蓝屏就循环回去,不蓝屏就走完 break ,冒烟就抛异常停了。在 main 里也这样循环就能换电脑了。
递归的话需要把 while 里面的提出来写一个方法,包含前面一句就会自动换电脑,包含后面一句就会重启正常以后讲两次课。应该是吧。
还有要抛出去的异常就不要 catch 了,弄多了以后就不知道是谁处理了。




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