2013-05-10 66 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