2014-01-23 42 views
0

我由哈希表,其中鍵(ID)是一個字符串,值是一個對象,哈希表<字符串,對象>返回null

public void addSpot(String id) { 
     Spot spot = new Spot(id); 
     SpotMap.addSpot(id, spot); // adds spot to table 
     spot.getMarkerOptions().position(new LatLng(28, 30)); 
     spot.addMark(map); // adds mark to map 
      Log.i("SPOT_TABLE", SpotMap.getSize()); 
    } 

    public void removeSpot(String id) { 
     try{ 
     Spot spot=SpotMap.getSpotMap().get(id); 
     spot.removeMark(spot.getMarker()); 
     SpotMap.removeSpot(id); 
      Log.i("SPOT_TABLE", SpotMap.getSize());} 
     catch(Exception e){} 

    } 

這是SpotMap類

package com.example.myapp; 

import java.util.ArrayList; 
import java.util.Enumeration; 
import java.util.Hashtable; 

import android.util.Log; 

import com.example.myapp.Spot; 

public class SpotMap { 

    private static Hashtable<String, Spot> spotMap = new Hashtable(); 

    public static Hashtable<String, Spot> getSpotMap() { 
     return spotMap; 
    } 

    // public static void setMarkermap(Hashtable<String, Spot> markermap) { 
    // MarkerMap.markerMap = markermap; 
    // } 

    public static void addSpot(String id, Spot spot) { 
     spotMap.put(id, spot); 

    } 

    public static void removeSpot(String id) { 
     spotMap.remove(id); // removes spot from table 
    } 

    public static void printTable(){ 
     Enumeration key = spotMap.keys(); 
     while (key.hasMoreElements()) { 
      System.out.println(spotMap.get(key.nextElement())); 

     } 
    } 
} 

的現貨類

package com.example.myapp; 

import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.Marker; 

    public class Spot { 
     private String id; 
     private MarkerOptions markerOptions; 
     private Marker marker; 

     public Spot(String id) { 
      this.id = id; 
      markerOptions = new MarkerOptions(); 
     } 

     public String getId() { 
      return id; 
     } 

     public void setId(String id) { 
      this.id = id; 
     } 

     public void setMarkerOptions(MarkerOptions markerOptions) { 
      this.markerOptions = markerOptions; 
     } 

     public void addMark(GoogleMap map) { 
      marker = map.addMarker(markerOptions); 
     } 

     public void removeMark(Marker marker) { 
      marker.remove(); 

     } 

     public MarkerOptions getMarkerOptions() { 
      return markerOptions; 
     } 

     public void setMarker(Marker marker) { 
      this.marker = marker; 
     } 

     public Marker getMarker() { 
      return marker; 
     } 
     /* 
     * public Spot getSpot() { return this; } 
     */ 
     public String toString(){ 
      return id; 

     } 
    } 

應用效果很好,當我加1點,並刪除它,但是當我連續加2點(有相同的ID),並調用重移動功能,我得到NullPointException,並沒有刪除標記 logcat的

01-23 10:10:36.698: I/SPOT_TABLE(5209): 1 
01-23 10:10:38.518: I/SPOT_TABLE(5209): 0 
01-23 10:10:40.098: I/SPOT_TABLE(5209): 1 
01-23 10:10:40.718: I/SPOT_TABLE(5209): 1 
01-23 10:10:41.748: I/SPOT_TABLE(5209): 1 
01-23 10:10:42.638: I/SPOT_TABLE(5209): 0 
01-23 10:10:44.488: I/SPOT_TABLE(5209): 1 
01-23 10:10:45.048: I/SPOT_TABLE(5209): 0 
01-23 10:10:48.628: I/SPOT_TABLE(5209): 1 
01-23 10:10:48.938: I/SPOT_TABLE(5209): 1 
01-23 10:10:49.368: I/SPOT_TABLE(5209): 1 
01-23 10:10:49.448: I/SPOT_TABLE(5209): 1 
01-23 10:10:49.708: I/SPOT_TABLE(5209): 1 
01-23 10:10:50.678: I/SPOT_TABLE(5209): 1 
01-23 10:10:50.938: I/SPOT_TABLE(5209): 0 

的logcat的打印哈希表的大小,你可以看到,添加相同的密鑰替換舊像往常一樣,也刪除按鈕似乎工作...但現在我認爲這是一個標記問題

+5

空的抓塊是萬惡之源。 –

+0

步驟1將不會吞下您的方法中可能出現的異常,但至少需要打印堆棧跟蹤。 – Keppil

+0

你的意思是說,你添加了兩個相同的ID點,你試圖刪除兩個?在這種情況下,只有最後一個點將出現在HashTable中,因爲在HashTable中不能有兩個具有相同鍵的對象。 – sthor69

回答

0

我的猜測是addMarker()方法返回null當您嘗試第二次添加Marker

這將導致你的實例變量成爲null,給你一個NullPointerExceptionremoveSpot()方法。

+0

公共最終標記addMarker(MarkerOptions選項) 返回 已添加到地圖的標記。 –

+0

我認爲Spot是從Hashtable中正確刪除的,但標記不會因爲某些原因被刪除,@Keppil –

0

它的工作,現在,我不得不編輯addSpot功能,插入新的 但直到現在纔來刪除舊entery,我不知道爲什麼

spot.removeMark(spot.getMarker()); 

沒有正確

工作
public void addSpot(String id) { 
      Spot spot = new Spot(id); 
      if (SpotMap.getSpotMap().containsKey(id)) { 
       removeSpot(id); 
      } 
      spot.getMarkerOptions().position(new LatLng(28, 30)); 
      SpotMap.addSpot(id, spot); // adds spot to table 
      spot.addMark(map); // adds mark to map 
      Log.i("SPOT_TABLE", SpotMap.getSize()); 
     } 
相關問題