我正在制作项目经理计划(非常简单)。基本上有CoWorkers和他们的任务。现在,我做了以下结构:我使用HashMap
键作为CoWorkers的名称,值总是CoWorkers ArryList
,当然包含他或她的工作。
我的问题是我可以创建这个结构但是当我尝试添加一个ArrayLists的任务时,我总是将null
作为返回值。
以下是我的代码段:
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!");
控制台上的结果将是:
nullnullGeorge
更新
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");
}
}
答案 0 :(得分:2)
查看代码ex.getMessage()+ jobs.get(name)+ name,当控制台打印出nullnullGeorge时,你必须得到空指针异常 它表示List itemsList = jobs.get(name); //这是null,因此是列表。 向List添加null将给出空指针Exception。这意味着在Map中添加George时,没有发生。
答案 1 :(得分:1)
所以我创建了自己的小测试类并证明你的代码有效。
我不认为你在这里向我们展示了一切。
我认为在某个地方你有两个变量“jobs”的定义,一个是隐藏另一个。
------ ------更新
好的,所以我用硬编码的名称和作业运行你的代码,它运行得很好。我的建议:尝试做同样的事。
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;
}
我怀疑你从文件中读到的内容与“乔治”不匹配,即使我们还不能理解为什么。一旦我们对列表处理有信心,那么我们就可以考虑数据了。
答案 2 :(得分: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>());
}
}