我编写了以下代码但得到以下编译错误:
可能尚未初始化局部变量dirArrow。注意 有关缺少'default:'on'switch'的问题 抑制,也许是 与此问题相关
//return the ID of the robot and arrow of his facing direction
public String toString(){
char dirArrow;
switch (direction) {
case UP: dirArrow= '^';
case RIGHT: dirArrow= '>';
case DOWN: dirArrow= 'V';
case LEFT: dirArrow= '<';
break;
}
return (Integer.toString(RoboID) + dirArrow);
}
答案 0 :(得分:2)
您需要初始化dirArrow
变量,如:
char dirArrow = ' ';
switch (direction) {
了解本地variable should be initialized。
的原因 注意:您还需要在每个案例块的末尾添加break
语句,如:
case UP: {
dirArrow= '^';
break;
}
答案 1 :(得分:1)
你有两个问题
您尚未初始化方法局部变量dirArrow
,将其初始化为char dirArrow = ' ';
每个案例结尾都没有中断。如果你没有在每个案例的末尾添加break,对于第一种情况,它将运行下面的所有case语句。
switch (direction) {
case UP: dirArrow= '^'; break;
case RIGHT: dirArrow= '>'; break;
case DOWN: dirArrow= 'V'; break;
case LEFT: dirArrow= '<'; break;
}
答案 2 :(得分:0)
从错误中可以清楚地看出,您必须初始化本地变量,例如&#39;&#39; 喜欢
char dirArrow='';
答案 3 :(得分:0)
在声明处初始化变量:char dirArrow = 0;
或添加默认块:
switch (direction) {
case UP: dirArrow= '^';
case RIGHT: dirArrow= '>';
case DOWN: dirArrow= 'V';
case LEFT: dirArrow= '<';
break;
defalut: dirArrow = 0;
}
BTW:为了让你的代码按预期工作,你应该在每个case语句之后添加一个break:
switch (direction) {
case UP: dirArrow= '^'; break;
case RIGHT: dirArrow= '>'; break;
case DOWN: dirArrow= 'V'; break;
case LEFT: dirArrow= '<'; break;
defalut: dirArrow = 0;
}
答案 4 :(得分:0)
如果方向不是这些值中的任何一个,你还没有说过你想要发生什么。也许那个目前是完整的方向,但将来它可能不是 - 而且从根本上说,Java编译器并没有检查你是否涵盖了每一个enum的可能性。 (正如其他回答者所指出的那样,您还缺少break
个陈述。)
就个人而言,我改变方法并完全摆脱switch
:向toChar
添加Direction
方法,然后您可以使用:
return Integer.toString(RoboID) + direction.toChar();
你的枚举构造函数也会使用该角色,因此它很容易实现。
很多清洁,IMO。唯一的缺点是它将你的角色表示与Direction
枚举联系在一起,这可能是与UI无关的。如果是这种情况,我会改为Map<Direction, Character>
,您可以非常简单地使用它:
return Integer.toString(RoboID) + DIRECTION_CHARS.get(direction);
如果您想坚持使用switch
语句,我就不会为其他人建议的变量添加初始值 - 我会抛出异常在default
案例中:
@Override public String toString() {
char dirArrow;
switch (direction) {
case UP:
dirArrow= '^';
break;
case RIGHT:
dirArrow= '>';
break;
case DOWN:
dirArrow= 'V';
break;
case LEFT:
dirArrow= '<';
break;
default:
throw new IllegalStateException("Unexpected direction! " + direction);
}
return (Integer.toString(RoboID) + dirArrow);
}
假设除了您列出的direction
之外,其他{{1}}确实无效。现在,如果你添加一个方向而忘记更新这个方法,你最终会得到一个异常而不是无声的坏数据。
不使用&#34;虚拟&#34;变量的初始值是它不表达您期望的行为。如果你要用语言向某人描述方法,你永远不会提到这个值,除非你真的有一个默认值(例如空格),在这种情况下,它绝对是正确的方式去吧。
答案 5 :(得分:0)
更好的解决方案是更改枚举
enum Direction {
UP("^"), DOWN("v"), LEFT("<"), RIGHT(">");
public final String arrow;
private Direction(String arrow) {
this.arrow = arrow;
}
}
// in your Robot class.
public String toString(){
return RoboID + direction.arrow;
}
BTW我会使用roboID
作为字段名称。