【发布时间】:2014-06-14 21:13:17
【问题描述】:
我正在尝试在 TreeMap 中添加 2 个列表的一些元素。我调试了项目,TreeMap 的 put 方法似乎不起作用,因为它为 Key 和 Value 设置了 null。
代码如下:
package SubTest;
import java.io.*;
import java.util.*;
public class Matrice implements Cloneable,Comparable<Object> {
private int nrCol;
private int nrLin;
private Object [][] matrix;
public Matrice(){
this.nrCol=0; this.nrLin=0;
this.matrix=null;
}
public Matrice(int nrColoane, int nrLinii, Object[][]m){
this.nrCol=nrColoane;
this.nrLin=nrLinii;
this.matrix=new Object[this.nrLin][this.nrCol];
for(int i=0;i<this.nrLin;i++)
for(int j=0;j<this.nrCol;j++)
this.matrix[i][j]=m[i][j];
}
public int getnrCol(){
return this.nrCol;
}
public void setnrCol(int c){
this.nrCol=c;
}
public int getnrLin(){
return this.nrLin;
}
public void setnrLin(int l){
this.nrLin=l;
}
public Object[][] getMatrix(){
return this.matrix;
}
public void citirefis(String fisier) throws FileNotFoundException, negativeNrLoc
{
BufferedReader bf=new BufferedReader(new FileReader(fisier));
List<PasagerVIP> vip=new ArrayList<PasagerVIP>();
List<PasagerEc> ec=new ArrayList<PasagerEc>();
String line=null; int nr=0;
try{
while((line = bf.readLine()) !=null){
nr++;
StringTokenizer token=new StringTokenizer(line," ");
int n=0; String nume=null; String mycard=null; float nrloc=0; float varsta=0; int id=0;
while(token.hasMoreElements()){
switch(n){
case 0: nume=token.nextToken(); break;
case 1: nrloc=Float.parseFloat(token.nextToken()); break;
case 2: varsta=Float.parseFloat(token.nextToken()); break;
case 3: id=Integer.parseInt(token.nextToken()); break;
case 4: mycard=token.nextToken(); break;
}
n++;
}
if(mycard.contains("vip")) {
PasagerVIP v=new PasagerVIP(nume,nrloc,varsta,id,mycard);
vip.add(v);
}
else if(mycard.contains("ec")){
PasagerEc e=new PasagerEc(nume,nrloc,varsta,id,mycard);
ec.add(e);
}
}
bf.close();
}
catch(IOException eoef){
eoef.printStackTrace();}
Map<Float,Object> harta=new TreeMap<Float,Object>();
int s1=vip.size();
for(int i=0;i<s1;i++){
harta.put(new Float(vip.get(i).getnrLoc()), vip.get(i));}
int s2=ec.size();
for(int i=0;i<s2;i++)
harta.put(new Float(ec.get(i).getnrLoc()), ec.get(i));
this.nrLin=(int)Math.sqrt(nr);
this.nrCol=(int)Math.sqrt(nr);
Set<Float> st=harta.keySet();
Iterator<Float> it=st.iterator();
for(int i=0;i<this.nrLin && it.hasNext();i++)
for(int j=0;j<this.nrCol && it.hasNext();i++){
Float loc=it.next();
Object o=harta.get(loc);
this.matrix[i][j]=o;}
}
}
堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
at SubTest.Matrice.citirefis(Matrice.java:128)
at SubTest.Main.main(Main.java:21)
【问题讨论】:
-
有什么错误吗?请提供完整代码。
-
什么是完整的错误堆栈跟踪? IT 应该说明 NullPointerException 发生在哪一行
-
不可能key和value都为null,因为null值表示
vip.get(i)或ec.get(i)为null,不能使用null调用getnrLoc()。请仔细修改您的列表包含的内容以及放入harta的内容。 -
创建 TreeMap 后,我将每个对象添加到对象矩阵中。错误在这一行:this.matrix[i][j]=o;因为 o 是一个空对象,因为它没有添加到 TreeMap。
-
我已经调试了我所有的项目,我确信 vip.get(i) 和 ec.get(i) 不为空。