黑马程序员技术交流社区
标题:
死循环
[打印本页]
作者:
赵喜平
时间:
2013-3-31 10:22
标题:
死循环
本帖最后由 赵喜平 于 2013-3-31 18:32 编辑
昨天看到的贴子,今天找不到了,又不会解决,,求助
此段代码一运行就会出现死循环
class LanPingException extends Exception{
LanPingException(String msg)
{
super(msg);
}
}
class MaoYanException extends Exception{
MaoYanException(String msg)
{
super(msg);
}
}
class TeachStopException extends Exception{
TeachStopException(String msg)
{
super(msg);
}
}
class FixComputer{
public void Fix()
{
System.out.println("把电脑修好了");
}
}
class Teacher{
private String name;
Teacher(String name)
{
this.name=name;
}
Computer co=new Computer();
FixComputer fi=new FixComputer();
public void teachxue()throws TeachStopException
{
try
{
co.run();
System.out.println(name+"老师在上课");
}
catch (LanPingException e)
{
System.out.println(e.getMessage());
co.result();
teachxue();
}
catch(MaoYanException e)
{ System.out.println(e.getMessage());
this.function();
}
}
public void function()
{
System.out.println("大家做练习吧");
fi.Fix();
}
}
class Computer{
private int i=1;
public void run()throws LanPingException,MaoYanException
{
if (i==1)
throw new LanPingException("电脑蓝屏了");
if(i==2)
throw new MaoYanException("电脑冒烟了");
System.out.println("电脑正常开机运行");
}
public void result()
{
System.out.println("电脑重启");
}
}
class ComputerTest{
public static void main(String[] args)
{ Teacher te=new Teacher("石松老师");
try
{
te.teachxue();
}
catch (TeachStopException e)
{
te.function();
}
}
}
复制代码
作者:
冯超
时间:
2013-3-31 10:49
看晕了··自己可以一点一点的写好了,慢慢测试!
作者:
陈腾跃_2013
时间:
2013-3-31 10:53
问题主要出在这段代码上,抛出蓝屏异常后,被catch到,然后调用result方法。
但是调用玩result方法后再次“通知老师”调用teachxue时,你定义的“i”还是等于1,所以再次抛异常,造成一直循环
我在result中加入了i = 0,代表电脑恢复正常
……………………
public void teachxue() throws TeachStopException {
try {
co.run();
System.out.println(name + "老师在上课");
} catch (LanPingException e) {
System.out.println(e.getMessage());
co.result();//处理电脑问题
teachxue();//处理后再次调用老师
} catch (MaoYanException e) {
System.out.println(e.getMessage());
this.function();
}
}
public void function() {
System.out.println("大家做练习吧");
fi.Fix();
}
}
class Computer {
private int i = 1;//作为错误代码而存在
public void run() throws LanPingException, MaoYanException {
if (i == 1)
throw new LanPingException("电脑蓝屏了");
if (i == 2)
throw new MaoYanException("电脑冒烟了");
System.out.println("电脑正常开机运行");
}
public void result() {
System.out.println("电脑重启");
i = 0;//重置错误代码
}
}
……………………
复制代码
作者:
熊永标
时间:
2013-3-31 11:12
本帖最后由 熊永标 于 2013-3-31 11:14 编辑
问题出现在这个类:
62.class Computer{
63. private int i=1;
64. public void run()throws LanPingException,MaoYanException
65. {
66. if (i==1)
67. throw new LanPingException("电脑蓝屏了");
68. if(i==2)
69. throw new MaoYanException("电脑冒烟了");
70. System.out.println("电脑正常开机运行");
71. }
72. public void result()
73. {
74. System.out.println("电脑重启");
75.
76. }
77.}
复制代码
分析得出:
在入口函数中调用teachxue(),而这个方法调用computer的run方法,因为 i 的值始终等于1,所以始终抛出 LanPingException("电脑蓝屏了")异常,而在teacher中的teachxue()处理完异常后又递归调用此方法,而 i的值并没有任何改变,所以就一直循环下去了,循环的根本原因就是递归调用函数.i 必需在正确的时刻动态的给i赋除1和2以外的值就可以了.
代码改正如下:
62.class Computer{
63. private int i=1;
64. public void run()throws LanPingException,MaoYanException
65. {
i=new Random().nextInt(2)+1;//产生一个一到三的随机数
66. if (i==1)
67. throw new LanPingException("电脑蓝屏了");
68. if(i==2)
69. throw new MaoYanException("电脑冒烟了");
70. System.out.println("电脑正常开机运行");
71. }
72. public void result()
73. {
74. System.out.println("电脑重启");
75.
76. }
77.}
复制代码
作者:
桉树
时间:
2013-3-31 12:13
真心看晕了,全代码没一个注释。看了一半就不想看了。。
LZ 希望你i以后能加些注释。{:soso_e128:}
作者:
赵喜平
时间:
2013-3-31 18:30
陈腾跃_2013 发表于 2013-3-31 10:53
问题主要出在这段代码上,抛出蓝屏异常后,被catch到,然后调用result方法。
但是调用玩result方法后再次 ...
:handshake
作者:
tshch1989
时间:
2013-3-31 18:34
在teacher中 catch (LanPingException e)
{
System.out.println(e.getMessage());
co.result();
teachxue();
}
在异常处理中请不要调用teachxue();
在co.result();后应该做的是co.i=0;你的程序中设置了private关键字,请提供改变i值得函数,
希望对你有帮助
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2