2013-05-10 97 views
1

我試圖理解我在這裏做錯了什麼,但它對我來說真的沒有意義。 我有一個類calleld LatLongBean 在這裏我試圖解析一個XML提要。當使用getter時,返回null值

我有一個方法,我做所有的邏輯。 和我有一些getters和setter。

這似乎是制定者工作,但吸氣劑不工作。

這是LatLongBean:

public class LatLongBean { 

    private String lat; 
    private String lng; 
    private String address; 
    private String url = "http://maps.googleapis.com/maps/api/geocode/xml?address="; 

    public void LatLongBean(String address, String lat, String lng) throws ParserConfigurationException, SAXException, IOException { 
     this.address = address; 
     this.lat = lat; 
     this.lng = lng; 

     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(new URL(url + address + "&sensor=false").openStream()); 
     doc.getDocumentElement().normalize(); 

     NodeList nodes = doc.getElementsByTagName("location"); 

     for (int i = 0; i < nodes.getLength(); i++) { 
      Node node = nodes.item(i); 

      if (node.getNodeType() == Node.ELEMENT_NODE) { 
       Element element = (Element) node; 
       lat = getValue("lat", element); 
       lng = getValue("lng", element); 
      } 
     } 
    } 

    private static String getValue(String tag, Element element) { 
     NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes(); 
     Node node = (Node) nodes.item(0); 
     return node.getNodeValue(); 
    } 

    public String getLat() { 
     System.out.println(lat); 
     return lat; 
    } 

    public String getLng() { 
     System.out.println(lng); 
     return lng; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

,這是我做什麼使用這個類:

LatLongBean latLong1 = new LatLongBean(); 
latLong1.setAddress("Amsterdam"); 
latLong1.getLat(); 
latLong1.getLng(); 

的吸氣劑返回null!

當我做了LatLongBean方法不是void和使用,因爲它就像一個魅力構造:

LatLongBean latLong1 = new LatLongBean("Amsterdam"); 
latLong1.getLat(); 
latLong1.getLng(); 

有人能幫助我嗎?

Thanx提前!

+0

你的代碼」已發佈甚至不會編譯,因爲你調用'new LatLongBean()'而不傳遞一個地址,並且你還沒有聲明這樣一個con structor。編輯:啊 - 我沒有發現它實際上不是一個構造函數。伊克! – 2013-05-10 05:37:24

+0

「lat」和「lng」完全沒有被初始化。如果'node.getNodeType()== Node.ELEMENT_NODE'對於任何'node'都不是真的,那麼它們都不會被初始化。 – Yuushi 2013-05-10 05:39:35

+0

確實。 Java默認構造函數僅在未指定任何其他構造函數的情況下生成,或者顯然已將其包含在類定義中。在這一點上,我懷疑你的Getter是看到代碼的問題,但是檢索值。一個重要的說明,代碼不會做你想做的事情。如果有多個Amsterdams,就像您的示例一樣,只有結果列表中最後一個阿姆斯特丹的位置可供您使用。由於這是很少受歡迎的城市,因此您的代碼可能不像預期的那樣行事! – Eric 2013-05-10 05:46:23

回答

5

您並未調用public void LatLongBean(String address, String lat, String lng)方法,它解析並設置值作業。

是啊這是一種方法。如果您想要成爲構造函數,則應從中刪除返回類型void。像下面

public LatLongBean(String address, String lat, String lng) { 
    // your constructor logic 
} 

並調用它像

LatLongBean latLong1 = new LatLongBean("http://youraddress.com/xml","a","b"); 
latLong1.setAddress("Amsterdam"); 
latLong1.getLat(); 
latLong1.getLng(); 

編輯:也在你應該是構造代碼更改以下行這樣

 if (node.getNodeType() == Node.ELEMENT_NODE) { 
      Element element = (Element) node; 
      this.lat = getValue("lat", element); // not using this will not write the Document read value to the class variable lat and lng, instead it writes to the parameter itself 
      this.lng = getValue("lng", element); 
     } 
+0

斑點。那太糟了。 – 2013-05-10 05:41:31

+0

如果我這樣做,獲得者將返回'a'和'b'。 – kawa 2013-05-10 05:47:53

+0

不,您正在覆蓋參數而不在代碼中使用它們。此外,您需要確保在代碼中使用coordiantes。現在,您將獲得所有位置映射到您提供的字符串作爲第一個輸入參數,並且只會將最後一個位置(通過結果列表迭代)分配給您的變量。 – Eric 2013-05-10 05:50:12