[英]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()
方法中的下载之后,并在解析之后使用Activity
的runOnUiThread()
方法来设置ListView
的Adapter
,因为您不能直接从该下载线程触摸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.