1

我有一个具有以下代码的类:

public class Crawler {

    String title;

    public void setTitle(String text) {
        title=text;
        //System.out.println(title);
    }

    public String getTitle() {
        // System.out.println(title);
        return title;
    }

    public void crawler() {
        Document doc;
        doc = connect("http://www.xyz.com//asd.html").timeout(0).get();
        title=doc.title();
        setTitle(title);
        System.out.println("Title : " + title);
    }
}

另一个类:

public class Results {

    public void output() {
        Crawler cw=new Crawler();
        System.out.println(cw.getTitle());
    }
}  

问题是,结果类中的 SOP 正在打印null

注释的 SOPsetTitle()正在打印所需的文本,但 SOPgetTitle()仍在说null

这里有任何范围问题吗?我不明白。当我调用该setTitle()方法时,全局标题变量不会改变吗?

对不起,我忘了提及这一点,我在下面有一个类,它以以下方式调用方法:

编辑1:

public class OA {
    public static void main(String[] args) 
    {
        Crawler cw=new Crawler();
        //LoadIntoDB ld= new LoadIntoDB();
        Results op=new Results();

        cw.crawler();
        //ld.load();
        op.output();
    }
}

当我运行 OA 类时,会调用爬虫类和结果类的方法。我仍然为空。

4

5 回答 5

5

问题是,结果类中的 SOP 正在打印 null

是的,它会的。您永远不会调用该crawler方法,这是唯一要调用的方法setTitle。也许你的意思是它是一个构造函数?如果是这样,您需要从此更改声明:

public void crawler() {

对此:

public Crawler() {
于 2013-07-04T08:48:46.787 回答
2

您刚刚实例化了Crawler该类。它有一个实例变量String title;null如果没有特别指定,实例引用变量将被默认为。您需要调用setTitle()来设置,title否则getTitle()必然返回null

这里重要的crawler()是不是Crawler类的构造函数。Java 区分大小写。

问题被编辑后:

在其当前的实现中,cw.crawler()应该抛出NPE。只需查看以下代码crawler()

public void crawler() {
    Document doc;
    title=doc.title(); // null pointer here , doc was never instantiated
    setTitle(title);
    System.out.println("Title : " + title);
}

重新编辑问题后:

public static void main()方法中,您正在创建一个实例Crawler并调用它的crawler()方法来设置它的title.

Crawler cw=new Crawler();

但是当你调用output()方法时,你正在创建一个不同的对象Crawler,它是一个新对象,它titlenull

public void output() {
    Crawler cw=new Crawler(); // new object
    System.out.println(cw.getTitle());
}
于 2013-07-04T08:55:46.487 回答
1

第 1 次更改public void crawler()public Crawler() 第 2 次


public void crawler() {
    Document doc;
    title=doc.title();
    setTitle(title);
    System.out.println("Title : " + title);
}

为 doc 分配一些值,否则您将得到 NullPointerException

于 2013-07-04T08:53:43.860 回答
1

这是因为titlenull这样的getTitle回报null。您在另一个类中创建了一个新对象,Crawler并且您现有的代码没有设置title.

如果要自动设置标题,则需要将该代码保留在构造函数中

public Crawler() {
    //some code to get your document
    title=doc.title();
    setTitle(title);
}
于 2013-07-04T08:48:40.113 回答
0

在这里,如果您public void crawler() {用作构造函数,则只需将其更改为public crawler(){ }

于 2013-07-04T08:56:33.853 回答