刘少伟 发表于 2012-5-3 02:20
lz你的nextLamp实现貌似不是红-黄-绿-红的顺序 把返回值改一下吧、
另外就是switch/case的地方,每一段之后 ...
十分感谢帮忙!但是灯的状态是没错的,绿灯之后才是黄灯,生活里的顺序。
另外,我查阅了一下java核心技术,才发现我的错,原文是这样的:
【警告】:switch语句有可能触发多个case分支。如果在case分支语句的末尾没有break语句,那么就会接着执行下一个case分支语句。这种情况相当危险,常常会引发错误。为此,我们在程序中从不使用switch语句。
——P70 《Java核心技术:卷1:基础知识》
细节真的使人挫败啊,楼主真是有心人。正确的解决方法就像你所说的,应该是考虑两点:
1.运行过程使用set方法修改了time的值,因此在状态转换时一定需要重置time;
2.没有break语句,无论满不满足case判断,每一个case都会执行(可以使用system.out输出检验)
希望我的错误能给看帖的人带来收获。
正确代码如下: - public static void display(TrafficLamp state){
- while (true) {
- switch (state) {
- case GREEN:
- if (state.getTime() != 0) {
- state.setTime(lampSleep(state, state.getTime()));
- } else {
- state = state.nextLamp();
- state.setTime(5);
- }
- break;
- case RED:
- if (state.getTime() != 0) {
- state.setTime(lampSleep(state, state.getTime()));
- } else {
- state = state.nextLamp();
- state.setTime(20);
- }
- break;
- case YELLOW:
- if (state.getTime() != 0) {
- state.setTime(lampSleep(state, state.getTime()));
- } else {
- state = state.nextLamp();
- state.setTime(25);
- }
- break;
- }
- }
- }
复制代码 |