0

我正在制作一个项目经理程序(一个非常简单的程序)。基本上有同事和他们的任务。现在,我制作了以下结构:我使用HashMap键作为 CoWorkers 的名称,值始终是ArryList包含他或她的工作的 CoWorkers。

我的问题是我可以创建这个结构,但是当我尝试添加一个任务时,我总是得到一个 ArrayListsnull作为返回值。

这是我的代码片段:

HashMap<String, ArrayList<String>> jobs = new HashMap<String, ArrayList<String>>();

public void createJobs(){
    nameReader();
    for(String name:names){
        File f = new File(name+"_job.txt");
        if(f.exists()){
            jobs.put(name, jobReader(name));
        }
    }
    Set set = jobs.entrySet(); 
    Iterator i = set.iterator(); 
    while(i.hasNext()) { 
        Map.Entry me = (Map.Entry)i.next(); 
        System.out.print(me.getKey() + ": "); 
        System.out.println(me.getValue()); 
    } 
}

在控制台上使用此方法后,我看到以下结果:

乔治:[洗衣服]

所以我认为我做的一切都很好。

但是之后:

public void addJob(String name, String job){
    try{
        List<String> itemsList = jobs.get(name);
    itemsList.add(job);
    }catch(Exception ex){
         System.err.println(ex.getMessage() + jobs.get(name) +name);
    }
}

我正在调用这个方法:

addjob("George","Clean up your room!");

控制台上的结果将是:

nullnull乔治

更新

public ArrayList jobReader(String name){
    ArrayList<String> tasks = new ArrayList<String>();
    try{
        Scanner s = new Scanner(new File(name+"_job.txt"));
        while (s.hasNext()){
            tasks.add(s.next());
        }
        s.close();
    }catch(IOException ioe){
        System.err.println("IOException: " + ioe.getMessage());
    }
    return tasks;
}

更新 2

这是我的漏洞代码:

public class CoWorkers {
    HashMap<String, ArrayList<String>> jobs = new HashMap<String, ArrayList<String>>();
    ArrayList<String> names = new ArrayList<String>();

    public void createJobs(){
        nameReader();
        for(String name:names){
            File f = new File(name+"_job.txt");
            if(f.exists()){
                jobs.put(name, jobReader(name));
            }
        }
        Set set = jobs.entrySet(); 
        Iterator i = set.iterator(); 
        while(i.hasNext()) { 
            Map.Entry me = (Map.Entry)i.next(); 
            System.out.print(me.getKey() + ": "); 
            System.out.println(me.getValue()); 
        } 
    }

    public void addName(String name){
        try{
            String filename= "Names.txt";
            FileWriter fw = new FileWriter(filename,true); 
            fw.write(name+"\n");
            fw.close();
        }
        catch(IOException ioe){
            System.err.println("IOException: " + ioe.getMessage());
        }
    }

    public void addJob(String name, String job){
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        try{
            List<String> itemsList = jobs.get(name);
            itemsList.add(job);
        }catch(Exception ex){
             ex.printStackTrace();
        }
    }

    public ArrayList jobReader(String name){
        ArrayList<String> tasks = new ArrayList<String>();
        try{
            Scanner s = new Scanner(new File(name+"_job.txt"));
            while (s.hasNext()){
                tasks.add(s.next());
            }
            s.close();
        }catch(IOException ioe){
            System.err.println("IOException: " + ioe.getMessage());
        }
        return tasks;
    }

    public void nameReader(){
        names.clear();
        try{
            Scanner s = new Scanner(new File("Names.txt"));
            while (s.hasNext()){
                names.add(s.next());
            }
            s.close();
        }catch(IOException ioe){
            System.err.println("IOException: " + ioe.getMessage());
        }
    }
    public static void main(String[] args) {
        CoWorkers project = new CoWorkers();
        project.createJobs();
        project.addJob("George","Do the laundry");
    }
}
4

3 回答 3

2

查看代码 ex.getMessage() + jobs.get(name) +name ,你必须得到空指针异常,因为你的控制台打印 nullnullGeorge 这意味着 List itemsList = jobs.get(name);//这是空的,因此是列表。将 null 添加到 List 会给你空指针异常。这意味着在 Map 中添加 George 时,没有发生。

于 2013-04-16T17:39:48.427 回答
1

所以我创建了自己的小测试类,并证明你的代码有效。

我不认为你在这里向我们展示了一切。

我认为在某处您对变量“工作”有两个定义,一个是隐藏另一个。

- - - 更新 - - -

好的,所以我用硬编码的名称和作业运行你的代码,它工作得很好。我的建议:尝试做同样的事情。

       String names[] = {"George", "Bill"};
        for(String name:names){          
             jobs.put(name, jobReader(name));              
        }

       public ArrayList jobReader(String name){
        ArrayList<String> tasks = new ArrayList<String>();
                tasks.add("Tidy");
            return tasks;
    }

我怀疑您从文件中读取的内容与“George”不匹配,尽管我们尚不知道原因。一旦我们对列表处理有信心,我们就可以考虑数据。

于 2013-04-16T17:48:35.360 回答
1

通常,如果您要操作该值,最好先检查您的地图是否包含键。例如:

public void addJob(String name, String job){

    if (!jobs.containsKey(name)) {
        jobs.put(name, new ArrayList<String>());
    }
    List<String> itemsList = jobs.get(name);
    itemsList.add(job);
}

您遇到的另一个问题是,当您找不到包含某人工作的文件时,您会默默地失败。考虑将其添加到createJobs()

    for(String name:names){
        File f = new File(name+"_job.txt");
        if(f.exists()){
            jobs.put(name, jobReader(name));
        } else { // This is new
            jobs.put(name, new ArrayList<String>());
        }
    }
于 2013-04-16T17:50:40.060 回答