【问题标题】:Why TreeMap put method doesn't work in Java?为什么 TreeMap put 方法在 Java 中不起作用?
【发布时间】: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) 不为空。

标签: java treemap


【解决方案1】:

构造函数应该正确创建数组,或者应该有一种方法可以在所需的维度上创建它,例如

public void createMatrix(){
    this.matrix = new Object[nrLin][nrCol];
}

这应该在第 86 行调用:

this.createMatrix();

由于this.matrix 为空,NPE 结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多