case switch java编译错误

时间:2014-04-29 11:23:04

标签: java switch-statement case

我编写了以下代码但得到以下编译错误:

  

可能尚未初始化局部变量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);
}

6 个答案:

答案 0 :(得分:2)

您需要初始化dirArrow变量,如:

char dirArrow = ' ';
switch (direction) {

了解本地variable should be initialized

的原因

注意:您还需要在每个案例块的末尾添加break语句,如:

case UP: {
    dirArrow= '^';
    break;
}

答案 1 :(得分:1)

你有两个问题

  1. 您尚未初始化方法局部变量dirArrow,将其初始化为char dirArrow = ' ';

  2. 每个案例结尾都没有中断。如果你没有在每个案例的末尾添加break,对于第一种情况,它将运行下面的所有case语句。


  3. 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作为字段名称。