2016-04-30 28 views
1

ウェブサイトからテーブルをdata_mineしてArrayList<String>に保存し、ListViewのレイアウトで表示します。プログラムを実行するたびにこのエラーが発生します。Androidスタジオ - jsoupで解析するとエラーが発生する(java.lang.NullPointerException)

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

    } 
} 
+0

は' doc'は 'null'なのであります。 –

+0

どうすればいいですか? @MikkeM。 – SimranTea

+0

ああ、ええ、そこにスレッドを投稿しました。それを見ていない。私はあなたのコードを再編成します。 –

答えて

1

あなたはダウンロードを実行するために、別のスレッドを開始し、docを初期化しています。このスレッドは非同期に実行されるため、スレッドを開始した直後にselect()を呼び出すと、はまだnullです。

あなたはそのダウンロードのスレッドから直接 View Sに触れることができないので、スレッドの run()方法でダウンロードした後に解析コードを移動し、S AdapterListViewを設定し、解析後の runOnUiThread()方法」 Activityを使用

。あなたは `を呼び出すことで`)(選択、あなたはそれがまだ完了していない右の前に開始したので、 `downloadThread`、そしてあなたがそれを初期化する場所それはおそらくだとき

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

ありがとう、私はそのクラスでやりたかったことを終えました。 – SimranTea

関連する問題