为什么会出现TreeSet.add 报空指针异常

无痛学习 2017-02-22 01:39:52

在向TreeSet中add对象的时候,总是报空指针异常

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import org.junit.Test;

/*
* 练习 TreeSet的自然排序和定制排序
*/
public class TestTreeSet {
@Test
public void test() {
//自然排序
Set<Item> set = new TreeSet<Item>();
set.add(new Item("Billy",4547));//此处报空指针异常
set.add(new Item("Eric",3369));
set.add(new Item("Magic",3608));
for(Object obj:set){
System.out.println(obj);
}

//定制排序
Comparator<Item> com = new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {

Item it1 = (Item) o1;
Item it2 = (Item) o2;
int i = it1.getPartNum().compareTo(it2.getPartNum());
if (i == 0) {
return it1.getDescription().compareTo(it2.getDescription());
} else {
return i;
}
}

};

SortedSet<Item> parts = new TreeSet<Item>(com);
parts.add(new Item("Tom", 1456));
parts.add(new Item("Sam", 2580));
parts.add(new Item("Kimi", 3369));
parts.add(new Item("Penny", 1234));

for (Object obj : parts) {
System.out.println(obj);
}
}
}

Item类,实现Comparable接口,实现hashCode,equals,compareTo方法

public class Item implements Comparable {

private String description;
private Integer partNum;
//构造器
public Item(){

}
public Item(String description, Integer patrNum) {
super();
this.description = description;
this.partNum = partNum;
}

public void setDescription(String description) {
this.description = description;
}

public String getDescription() {
return this.description;
}

public Integer getPartNum() {
return partNum;
}
public void setPartNum(Integer partNum) {
this.partNum = partNum;
}

@Override
public String toString() {
return "Item [description=" + description + ", partNum=" + partNum
+ "]";
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((description == null) ? 0 : description.hashCode());
result = prime * result + ((partNum == null) ? 0 : partNum.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Item other = (Item) obj;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
if (partNum == null) {
if (other.partNum != null)
return false;
} else if (!partNum.equals(other.partNum))
return false;
return true;
}

@Override
public int compareTo(Object o) {
if(o instanceof Item){
Item it = (Item)o;
int i = this.partNum.compareTo(it.partNum);
if(i == 0){
return this.description.compareTo(it.description);
}else{
return i;
}
}
return 0;
}

}


一直想不明白,初学java,请帮我看一下好吗
...全文
295 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
galiniur0u 2017-02-22
  • 打赏
  • 举报
回复
    public Item(String description, Integer patrNum) {
        super();
        this.description = description;
        this.partNum = partNum;
    }
楼主,你变量敲错了哈, Integer patrNum
无痛学习 2017-02-22
  • 打赏
  • 举报
回复
谢谢,我找到原因了,是构造器参数的问题。eclipse没有识别出这两个参数名是一样的,我也是醉了。 public Item(String description, Integer patrNum) { super(); this.description = description; this.partNum = partNum; } 怪不得每次声明对象的时候,Integer的值总是null,原来根本就没传进去
zs808 2017-02-22
  • 打赏
  • 举报
回复
看一下详细的异常堆栈,注意栈顶(最上面那行)对应的方法

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧