2013-04-16 85 views
0

我正在製作一個項目經理程序(一個非常簡單的程序)。基本上有CoWorkers和他們的任務。現在,我做了以下結構:我使用HashMap鍵作爲CoWorkers的名稱,值始終是CoWorkers ArryList,當然包含他或她的工作。使用ArrayList創建一個HashMap

我的問題是我可以創建這個結構,但是當我嘗試添加一個任務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

UPDATE

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

您的方法從哪裏調用? –

+0

您是否可以在addJob方法中打印作業的內容,並在添加新作業時驗證內容仍然存在? – Farzad

+0

另外,不是打印ex.getMessage(),而是調用ex.printStackTrace()。這往往是非常有益的 –

回答

1

所以我創建了我自己的小測試類,並證明你的代碼有效。

我不認爲你在這裏向我們展示了一切。

我想某處你有兩個變量「jobs」的定義,一個隱藏另一個。

------更新------

OK,所以我硬編碼的名字和工作運行的代碼,它工作得很好。我的建議:嘗試做同樣的事情。

 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」不匹配,即使我們還不能看出原因。一旦我們對列表處理有信心,那麼我們可以考慮數據。

+0

我在那裏發佈了我的完整代碼 – Wermerb

+0

謝謝,我正在嘗試這個。 – Wermerb

+0

它正在工作 – Wermerb

2

角度看待代碼ex.getMessage()+ jobs.get(名)+名,你的控制檯打印時必須得到空指針異常nullnullGeorge 這意味着List itemsList = jobs.get(name); //這是null,因此是列表。 將null添加到List將給予null空指針Exception.That意味着在Map中添加George時沒有發生。

+0

非常感謝您的幫助。我認爲你是對的,但問題在哪裏呢? – Wermerb

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>()); 
     } 
    }