Android Studio - 使用jsoup解析抛出错误(java.lang.NullPointerException)

时间:2016-04-30 04:00:55

标签: java android jsoup

我正在尝试从网站上数据化一个表格,将其存储到ArrayList<String>并在ListView版面上查看。每次运行程序时都会出现此错误。

04-29 23:52:57.122 20095-20095/com.example.user.datamining E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.project.datamining, PID: 20095
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.datamining/com.example.user.DataMining}: java.lang.NullPointerException: Attempt to invoke virtual method 'org.jsoup.select.Elements org.jsoup.nodes.Document.select(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2521)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595)
at android.app.ActivityThread.access$800(ActivityThread.java:178)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'org.jsoup.select.Elements org.jsoup.nodes.Document.select(java.lang.String)' on a null object reference

这是我的代码:

package com.example.user.datamining;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;

public class DataMining extends AppCompatActivity {
    Document doc;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data_mining);

        Thread downloadThread = new Thread() {
            public void run() {

                try {
                    doc = Jsoup.connect("http://thewebsite.html").get();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        downloadThread.start();

        ArrayList<String> list = new ArrayList();
            Elements table = doc.select("table"); 
            Elements rows = table.select("tr");

            for (int i = 0; i < rows.size(); i++) { 
                org.jsoup.nodes.Element row =  rows.get(i);
                Elements cols = row.select("td");

                list.add(cols.get(i).text());


                ArrayAdapter<String> adapter = new ArrayAdapter(this, R.layout.datalayout, list);
                ListView view = (ListView) findViewById(R.id.dataListView);
                view.setAdapter(adapter);
            }

    }
}

1 个答案:

答案 0 :(得分:1)

您正在启动单独的线程来执行下载,并初始化doc。该线程以异步方式运行,因此当您在启动线程后立即调用doc时,null仍为select()

在线程的run()方法中将解析代码移至下载后,并在解析后使用Activity的{​​{1}}方法设置runOnUiThread() ListView,因为您无法直接从该下载主题触摸Adapter

View