枚举类型上的空指针访问警告

时间:2014-01-07 06:22:13

标签: java enums

我的MainActivity代码是

private void updateConnectionState()
      {
              Device localDevice = this.Controller.getConnectedDevice();
              if (localDevice == null)

              updateModelSpinner(localDevice.getType());    //warning at this line          
              str2 = localDevice.getHostName();
              if (!TextUtils.isEmpty(str2))

            }




private void updateSpinner(Device.Type paramType)
      {
        boolean bool = Device.Type.UNKNOWN.equals(paramType);
        int i = 0;
        if (!bool)
          i = 1 + paramTvType.ordinal();
        this.ModelSpinner.setSelection(i);
      }

private void ModelSpinner(Device.Type paramType)
      {
        boolean bool = Device.Type.UNKNOWN.equals(paramType);
        int i = 0;
        if (!bool)
          i = 1 + paramType.ordinal();
        this.ModelSpinner.setSelection(i);
      }

我的枚举类是

public class Device {

    private Type type = Type.A_LOGIC;   

    public static Type getTypeForId(int paramInt)
      {
        switch (paramInt)
        {
        default:
          return Type.A_LOGIC;      
        case 0:
          return TvType.B_LOGIC;
        case 1:
          return TvType.A_LOGIC;
        case 2:
          return TvType.D_LOGIC;
        case 3:
          return TvType.E_LOGIC;
        case 4:
        }
        return TvType.F_LOGIC;          
      }

  public void setType(Type paramType)
      {
        this.Type = paramType;
      }

     public enum Type
     {       
         A_LOGIC("A_LOGIC"),                
         B_LOGIC ("B_LOGIC" ),      
         C_LOGIC ("C_LOGIC"), 
         D_LOGIC("D_LOGIC"),
         E_LOGIC ("E_LOGIC"),
        UNKNOWN("UNKNOWN");

        private String object;

        TvType(String localobj)
        {
            this.object; = localobj;
        }       
        public String getLetter()
        {
          return this.object;;
        }       
     }

 public Type getType()
      {
        return this.type;
      }

并且在方法内部的主要活动中调用类型为

updateSpinner(localDevice.getType());

但是这里显示警告

Null pointer access: The variable localTVDevice can only be null at this location

并在该行抛出一个零点错误。 我是枚举概念的新手,请告诉我为什么它会抛出这个错误。我提到堆栈溢出但找不到答案。

3 个答案:

答案 0 :(得分:2)

从你的代码:

Device localDevice = this.Controller.getConnectedDevice();
if (localDevice == null)

updateModelSpinner(localDevice.getType());

因为if没有{},所以此代码类似于:

Device localDevice = this.Controller.getConnectedDevice();
if (localDevice == null) {
    updateModelSpinner(localDevice.getType());
}

因此警告

<强> FIX:

Device localDevice = this.Controller.getConnectedDevice();
if (localDevice != null) {
    updateModelSpinner(localDevice.getType());
    // more code using localDevice
}

答案 1 :(得分:1)

问题在于此代码

if (localDevice == null)
    updateModelSpinner(localDevice.getType()); 

如果localDevice为null,   然后调用updateModelSpinner(null.getType())

你可能想要这段代码:

if (localDevice != null)
    updateModelSpinner(localDevice.getType()); 

当localDevice为null时,您必须决定应该发生什么。

答案 2 :(得分:0)

此编译器警告表示变量(在本例中为 localTVDevice )未赋值,并且通过此变量调用方法无疑会在运行时产生 NullPointerException

还有一件事我在你的代码中看到了什么?您可以直接将枚举值与'=='进行比较,而不是像在此行中那样使用等号:

boolean bool = Device.Type.UNKNOWN.equals(paramType);

boolean bool = paramType == Device.Type.UNKNOWN;