以下哪个选项的函数能够执行成功? 为什么?

A:

public class Type {

    public enum TypeEnum {
        ZERO,
        ONE
    }

    private TypeEnum type;

    public TypeEnum getType() {
        return type;
    }

    public void setType(TypeEnum type) {
        this.type = type;
    }

    public String getTypeString() {
        switch (type) {
            case ZERO:
                return "ZERO";
            case ONE:
                return "ONE";
            default:
                return "OTHER";
        }
    }
}

B:

public class Type {

    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getTypeString() {
        switch (type) {
            case "0":
                return "ZERO";
            case "1":
                return "ONE";
            default:
                return "OTHER";
        }
    }
}

C:

public class Type {

    private int type;

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getTypeString() {
        switch (type) {
            case 0:
                return "ZERO";
            case 1:
                return "ONE";
            default:
                return "OTHER";
        }
    }
}

D:

public class Type {

    private Integer type;

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public String getTypeString() {
        switch (type) {
            case 0:
                return "ZERO";
            case 1:
                return "ONE";
            default:
                return "OTHER";
        }
    }
}

答案:

以上选项只有 C 可以正常执行,其他的都会报空指针异常。

首先看以下阿里巴巴Java开发手册 如下:

当 switch 括号内的变量类型为 String 并且此变量为外部参数时,必须先进行 null
判断。

由于Integer默认初始值为null,而int默认初始值是0,所以 C 选项可以正常执行。