关于“空指针”怪物

时间:2010-11-02 05:49:34

标签: java nullpointerexception

冒着听起来像第一次编程的风险,我问的是关于“Null Pointer”怪物的无处不在的问题。这是一段代码:

public class pixel
{
    private String type = "empty";

    private void Type(String t){type = t;}
    private String Type(){if(type!=null)return type; else return "empty";}
}

意识到这一点:在我的整个代码中,我没有将null传递给Type。为什么type不返回值? (作为旁注,我在paintComponent的扩展中调用了这个方法。为了排除null数组(存储像素对象)的可能性,我做了相应的检查)

6 个答案:

答案 0 :(得分:3)

我同意Type()永远不会返回null。除非"empty"从未被调用或最近一次通过Type(String),否则它不会返回null

作为一个注释,你的类设计令人困惑(例如两个名称相同但目的不同的方法,没有构造函数)。

答案 1 :(得分:1)

首先,明确表示setType(String t)getType()。现在,请检查您的设置器中的null

public class pixel {

    private String type = "empty";

    private void setType(String t){if (t!=null) type = t;}
    private String getType(){return type;}
}

啊哈!我刚注意到你的方法是private。你是认真的吗?松散地说,你的type变量永远不会改变。我建议的代码,不知道您的应用程序,

public class pixel {

    private String type = "";

    public void setType(String t){
        if (t != null) 
            type = t;
    }

    public String getType(){
        return type;
    }
}

答案 2 :(得分:1)

如果您知道永远不会传递null类型,请使用以下模式:

public final class Pixel {

  private String type;

  private Pixel(String type) {
    setType(type);
  }

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

  private String getType() {
    return type;
  }
}

在每次分配到type字段之前,代码会检查分配的值是否为空。这与getter和setter结合使用可确保此不变量成立。除非这是一个内部类,你可以从封闭的代码中修改它。

答案 3 :(得分:0)

遵循逻辑。

从你的代码中,type永远不能为null,所以没有必要检查它。

答案 4 :(得分:0)

在这种情况下,type永远不会为null,但这是一个非常简单的情况。顺便说一句,如果它在某些情况下变为null,则应返回空字符串"",或者只返回null,具体取决于您的设计。在这种情况下可能会容忍"empty",但不要使用这样的东西。

答案 5 :(得分:0)

也许我在这里忽略了这一点,但不是很明显(不是特定于java),让我们事后修改代码:

public class pixel
{
    private String type = "empty"; //type string with a value of "empty" is available everywhere in the class --- (1)

    private void Type(String t)
    {
        type = t;
    }
    private String Type()
    {
        if(type!=null) //How can type is null or anything else, you have defined it in (1)
        {
            return type; 
        }

        else
        { 
            return "empty"; //Type RETURNS "empty" as a value.
        }
    }

    public static void main(String[] args)
    {
        pixel obj = new pixel();
        System.out.println(obj.Type()); //You call Type() here
    }
}

如果您在班级范围内的任何地方使用全局变量,则可以使用。