简体   繁体   English

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

[英]Android Studio - Parsing with jsoup throws error (java.lang.NullPointerException)

I am trying to data_mine a table from a website, store it into an ArrayList<String> and view it on a ListView layout.我正在尝试从网站上对表进行数据挖掘,将其存储到ArrayList<String>并在ListView布局上查看它。 Every time I run the program I get this error.每次运行程序时都会出现此错误。

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

This is my code:这是我的代码:

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);
            }

    }
}

You're starting a separate thread to perform the download, and initialize doc .您正在启动一个单独的线程来执行下载,并初始化doc This thread runs asynchronously, so doc is still null when you call select() on it right after starting the thread.该线程异步运行,因此在启动线程后立即调用select()doc仍然为null

Move the parsing code to after the download in the thread's run() method, and use the Activity 's runOnUiThread() method after the parse to set the ListView 's Adapter , since you can't touch View s directly from that download thread.将解析代码移动到线程的run()方法中的下载之后,并在解析之后使用ActivityrunOnUiThread()方法来设置ListViewAdapter ,因为您不能直接从该下载线程触摸View s .

private Document doc;
private ArrayList<String> list = new ArrayList<>();

@Override
protected void onCreat(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();

                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());
                }

                runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            setListAdapter();
                        }
                    }
                );
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    downloadThread.start();
}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM