【问题标题】:Java object is not returning expected dataJava 对象未返回预期数据
【发布时间】:2014-02-24 21:21:33
【问题描述】:

我有下面的方法,它将数据传递到一个也包含在内的对象中。如果我一步一步调试程序,那么我可以看到正确的数据被传递到对象的每个字段中。但是,一旦我尝试执行 println,我就无法从对象中获取正确的数据

对于循环的每次迭代,从scrape中获取的数据被传递给对象:

[Prague, Aer, Lingus, EI645, 24, Feb, 17:15, Arrived, 17:32]

并且毫无问题地分配给所有字段。当我调用 print 方法时,我得到以下内容,而不是上述行之一

====================TEST=======================
com.beezer.DublinAirportArrivals.ArrivalDetails@25595f51
================END TEST=======================

我在这里做错了什么?

public HtmlParser(Properties config) throws IOException{

    url = config.getProperty("url");
    airline = config.getProperty("airline");

    print("Fetching.........%s" , url);

}

public ArrayList<ArrivalDetails> process() throws IOException{
    Document doc = Jsoup.connect(url).get();

    Elements tableRow = doc.getElementsByTag("tr");

    for(Element tr : tableRow){
        if(tr.text().contains(airline)){
            if(tr.text().contains("Arrived")){
            String delims = "[ ]+";
            String[] singleRowArray = tr.text().split(delims);
            ArrivalDetails temp = new ArrivalDetails(singleRowArray);
            capture.add(temp);
            }
        }

    }
    testPrint();
    return capture;
}

public static void testPrint(){
    System.out.println("====================TEST=======================");
    System.out.println(capture.get(capture.size()-1));
    System.out.println("================END TEST=======================");
}

这是我的另一堂课

public class ArrivalDetails {

    public ArrivalDetails(String[] singleRowArray) {
        String origin = singleRowArray[0];
        String airline1 = singleRowArray[1];
        String airline2 = singleRowArray[2];
        String flightNo = singleRowArray[3];
        String date = singleRowArray[4];
        String month = singleRowArray[5];
        String ArrTime = singleRowArray[6];
        String status = singleRowArray[7];

    }

}

【问题讨论】:

  • 您尚未覆盖 ArrivalDetails 类的 toString() 方法。
  • 你能给我解释一下吗?
  • 当你说println(capture.get(capture.size()-1)) 时,Java 不知道你想显示什么。你想让它只打印原点吗?也许只是日期?您必须通过编写 toString() 方法来指定要打印的内容。
  • @mcgowan.b 鉴于这个问题和您的其他问题,我强烈建议您花一些时间使用 Oracle 提供的非常好的免费在线 Java Tutorialthis page的底部回答了这个问题。

标签: java arrays argument-passing


【解决方案1】:

你需要在你的类中添加一个toString() 方法。这说明了在打印这种类型的对象时要显示的内容。这是一个示例,您可以将其添加到您可以修改的类中。

@Override
public String toString() {
    return origin + " " + date;
}

但是请注意,当您的类现在编写时,您的任何变量都不可访问。您在构造函数中创建它们,它们仅在构造函数中可见/可用。您需要使它们成为类变量。你可以这样改

public class ArrivalDetails {

    String origin;
    String airline1;

    public ArrivalDetails(String[] singleRowArray) {
        this.origin = singleRowArray[0];
        this.airline1 = singleRowArray[1];
    }
}

查看 StackOverflow 上的其他问题以获取更多信息。 How to use toString() in Java

【讨论】:

  • 优秀。如果我想使用我在 println 上获得的输出作为字符串,我该怎么做。我可以调用 toString 方法并使用返回字符串吗?
  • 如果你的意思是 String s = myObject.toString() 是的,你可以这样做。
【解决方案2】:

您看到了toString() method on the Object class 的结果,并且您没有在ArrivalDetails 中覆盖它。

此方法返回一个等于以下值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

覆盖它,以便您控制该类实例的输出。在该方法中,您构造并返回将传递给System.out.printlnString

之所以调用toString()是因为字符串转换,被JLS Section 5.1.11覆盖:

[T] 转换是通过调用被引用对象的 toString 方法执行的,不带参数;但如果调用 toString 方法的结果为 null,则使用字符串“null”代替。

【讨论】:

    【解决方案3】:

    用一些“胶水解释”来扩展其他答案,

    System.out.println(Object o);
    

    打印结果

    o.toString()
    

    并且由于您尚未覆盖 toString,因此适用 Object#toString 的原始实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 2019-10-27
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多