0

我创建了包含特征几何和属性的对象:

public class Feature {
Feature(String wkt) {
this.wkt = wkt;
}

private HashMap<Column, String> columnMap;
private String wkt;

public String getWKT() {
return wkt;
}
public void addAttribute(Column column, String value) {
columnMap.put(column, value);
}
public String getAttribute(String column) {
return columnMap.get(column) ;
}
public Map<Column, String> getAttributes(){
    return columnMap;

}
}

Wkt 是一个几何图形。ColumnMap 是对象,包含一个属性为 HashMap:

public class Column {

private String columnName;

Column(String columnName) {
  this.columnName = columnName;
}

public String getName() {
  return columnName;
}
}

现在我说:

columnList = new ArrayList<Column>(columns);

......

Feature feature= new Feature(WKT);
for(int p=0;p<columnList.size();p++){
for(int k=0;k<=ViewObject.getMIDInfo(totalObjects).length;k++){
   if(p==k){
       System.out.println("Column  "+columnList.get(p).getName()+"  Value  "+ ViewObject.getMIDInfo(totalObjects)[k].toString());
      //feature.addAttribute(columnList.get(p), ViewObject.getMIDInfo(totalObjects)[k].toString());
   }
}
}

并获得输出:

Column  id  Value  22
Column  kadnumm  Value  "66-41-0707001-19"

所以我怎么理解columnListViewObject.getMIDInfo(totalObjects)不空。在此之后我改变:

//feature.addAttribute(columnList.get(p), ViewObject.getMIDInfo(totalObjects)[k].toString());

至:

feature.addAttribute(columnList.get(p), ViewObject.getMIDInfo(totalObjects)[k].toString());

并获得例外:

Column  id  Value  22
java.lang.NullPointerException
at objects.Feature.addAttribute(Feature.java:18)
at objects.MIFParser.findRegion(MIFParser.java:181)
at objects.MIFParser.instanceNextObject(MIFParser.java:66)
at Read.main(Read.java:40)

我如何理解 NullPointerException 意味着我尝试使用空对象?怎么了?
Ps 对不起,我的英语可能很糟糕,尤其是标题。

更新

好吧,我添加了这个:this.columnMap = new HashMap<Column, String>();在 FEature 类构造函数中。

但现在我尝试做:

System.out.println(feature.getAttribute("id")+" "+feature.getAttribute("kadnumm"));

和输出:

null null

有什么问题?

4

5 回答 5

3

您没有初始化您的 columnMap:

private HashMap<Column, String> columnMap = new HashMap<Column, String>();
于 2012-12-27T09:02:27.513 回答
2

创建 Feature 的新实例时,不会初始化 columnMap 对象。所以当你打电话时它是空columnMap.put(column, value);addAttribute

于 2012-12-27T09:03:59.427 回答
2

代替

private HashMap<Column, String> columnMap;

 private HashMap<Column, String> columnMap = new HashMap<Column, String>();
于 2012-12-27T09:04:04.090 回答
2

addAttribute试图穿上一些东西columnMap,但你没有columnMap在任何地方创造。您需要添加到您的Feature构造函数:

Feature(String wkt) {
    this.wkt = wkt;
    this.columnMap = new HashMap<Column, String>(); // <=== The new bit
}

...或在您的声明中添加初始化:

private HashMap<Column, String> columnMap = new HashMap<Column, String>();
//                        The new bit--- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

仅仅声明成员是不够的,成员只是引用一个对象,然后开始null。您需要为其创建对象以引用该对象并将其分配给它。

于 2012-12-27T09:01:50.377 回答
1

您必须初始化地图:

private HashMap<Column, String> columnMap = new HashMap<Column, String>();
于 2012-12-27T09:04:37.307 回答