Java 使用getter时返回null的值

Java 使用getter时返回null的值,java,null,latitude-longitude,getter-setter,Java,Null,Latitude Longitude,Getter Setter,我试图理解我在这里做错了什么,但这对我来说真的没有意义。 我有一个叫做LatLongBean的类 这里我试图解析一个XML提要 我有一个方法,我做所有的逻辑。 我有一些能手和二传手 看起来二传手在起作用,但接球手却不起作用 这是LatLongBean: public class LatLongBean { private String lat; private String lng; private String address; private String

我试图理解我在这里做错了什么,但这对我来说真的没有意义。 我有一个叫做LatLongBean的类 这里我试图解析一个XML提要

我有一个方法,我做所有的逻辑。 我有一些能手和二传手

看起来二传手在起作用,但接球手却不起作用

这是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;
    }
}
getter返回null

当我使LatLongBean方法不失效,并将其用作构造函数时,它就像一个符咒:

LatLongBean latLong1 = new LatLongBean("Amsterdam");
latLong1.getLat();
latLong1.getLng();
谁能帮帮我吗


先走一步

您没有调用
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);
        }

您没有调用
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);
        }


您发布的代码甚至不会编译,因为您正在调用
new LatLongBean()
,而没有传递地址,而且您还没有声明这样的构造函数。编辑:啊-我没有发现它实际上不是一个构造函数。哎呀!完全有可能
lat
lng
从未初始化过。如果任何
节点
node.getNodeType()==node.ELEMENT\u node
都不是真的,那么它们都不会被初始化。确实如此。Java默认构造函数只有在您没有指定任何其他构造函数,或者显然已经将其包含在类定义中时才会生成。在这一点上,我怀疑您的Getter是查看代码的问题,而是检索值的问题。一个重要的注意事项是,代码并没有执行您希望它执行的操作。如果有多个阿姆斯特丹,如您的示例所示,则只有结果列表中最后一个阿姆斯特丹的位置可供您使用。因为那很少是比较受欢迎的城市,所以您的代码可能不会像预期的那样运行!Thanx的警告,但我没有困难找到正确的阿姆斯特丹,它只返回1 lat和1 long。我遇到的问题甚至在使用小村庄名称时也会出现。您发布的代码甚至无法编译,因为您正在调用
new LatLongBean()
,但没有传递地址,而且您还没有声明这样的构造函数。编辑:啊-我没有发现它实际上不是一个构造函数。哎呀!完全有可能
lat
lng
从未初始化过。如果任何
节点
node.getNodeType()==node.ELEMENT\u node
都不是真的,那么它们都不会被初始化。确实如此。Java默认构造函数只有在您没有指定任何其他构造函数,或者显然已经将其包含在类定义中时才会生成。在这一点上,我怀疑您的Getter是查看代码的问题,而是检索值的问题。一个重要的注意事项是,代码并没有执行您希望它执行的操作。如果有多个阿姆斯特丹,如您的示例所示,则只有结果列表中最后一个阿姆斯特丹的位置可供您使用。因为那很少是比较受欢迎的城市,所以您的代码可能不会像预期的那样运行!Thanx的警告,但我没有困难找到正确的阿姆斯特丹,它只返回1 lat和1 long。我遇到的问题甚至在使用一个小村庄的名字时也会出现。很明显。太可怕了。如果我这样做,getter将返回“a”和“b”。不,您正在覆盖参数,而不在代码中使用它们。此外,您需要确保在代码中使用坐标。现在,您正在将所有位置映射到作为第一个输入参数提供的字符串,并且在遍历结果列表时,仅将最后一个位置分配给变量。@kawa请查看我的新编辑,您应该在阅读文档的值时使用
this.lat
,我真的很感谢您的帮助!在变量前面插入这个后,我得到一个结果,但不是setter的结果。当我这样使用它时:LatLongBean latLong1=新的LatLongBean(“a”、“b”、“c”);latLong1.设置地址(“阿姆斯特丹”);我得到了“a”的结果。太可怕了。如果我这样做,getter将返回“a”和“b”。不,您正在覆盖参数,而不在代码中使用它们。此外,您需要确保在代码中使用坐标。现在,您正在将所有位置映射到作为第一个输入参数提供的字符串,并且在遍历结果列表时,仅将最后一个位置分配给变量。@kawa请查看我的新编辑,您应该在阅读文档的值时使用
this.lat
,我真的很感谢您的帮助!在变量前面插入这个后,我得到一个结果,但不是setter的结果。当我这样使用它时:LatLongBean latLong1=新的LatLongBean(“a”、“b”、“c”);latLong1.设置地址(“阿姆斯特丹”);我得到“a”的结果