冒着听起来像第一次编程的风险,我问的是关于“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数组(存储像素对象)的可能性,我做了相应的检查)
答案 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
}
}
如果您在班级范围内的任何地方使用全局变量,则可以使用。