2016-03-31 22 views
0

私はここで少し助けが必要です。私はAsyncTask(学習)を使用しようとしています。私がアプリケーションを実行すると、AsyncTask#1によって致命的な例外エラーが発生し、これはNULLポインタの例外です。 doInBackgroundの実行中に発生したと報告しています。これは、あなたがそれに値を割り当てることはありませんので、これは、私がAndroid。致命的な例外:AsyncTask#1

FATAL EXCEPTION: AsyncTask #1 
Process: com.example.vladzakharo.rssreader, PID: 2573 
java.lang.RuntimeException: An error occurred while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:309) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference 
at com.example.vladzakharo.rssreader.Title.doInBackground(Title.java:59) 
at com.example.vladzakharo.rssreader.Title.doInBackground(Title.java:19) 
at android.os.AsyncTask$2.call(AsyncTask.java:295) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 

答えて

1

newsListを取得していますエラーですnullあるクラス

public class Title extends AsyncTask <Void, Void, ArrayList> { 

public ArrayList<HashMap<String, Object>> newsList; 
HashMap<String, Object> hm; 
public static String TITLE = "title"; 
public static String LINK = "link"; 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
} 

@Override 
protected ArrayList doInBackground(Void... params) { 
    try { 
     URL url = new URL("some url"); 

     XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     XmlPullParser parser = factory.newPullParser(); 

     parser.setInput(getInputStream(url), "UTF_8"); 

     boolean insideItem = false; 

     int eventType = parser.getEventType(); 
     while (eventType != XmlPullParser.END_DOCUMENT) { 
      if (eventType == XmlPullParser.START_TAG) { 

       if (parser.getName().equalsIgnoreCase("item")) { 
        insideItem = true; 
       } else if (parser.getName().equalsIgnoreCase("title")) { 
        if (insideItem){ 
         hm = new HashMap<>(); 
         hm.put(TITLE, parser.nextText()); 
        } 
       } else if (parser.getName().equalsIgnoreCase("link")) { 
        if (insideItem){ 
         hm.put(LINK, parser.nextText()); 
         newsList.add(hm); 
        } 
       } 
      } else if (eventType == XmlPullParser.END_TAG && parser.getName().equalsIgnoreCase("item")) { 
       insideItem = false; 
      } 

      eventType = parser.next(); 
     } 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return newsList; 
} 

です。 NullPointerExceptionを避けたい場合は、newsList(たとえば、newsList=new ArrayList<HashMap<String, Object>>();)に値を割り当てた後まで、にadd()を呼び出しないでください。

+0

CommonsWareの答えは正しいが、私は初期化が冗長だと思う、newsList = new ArrayList <>();十分です – ARP

+1

@ARP:それはJavaのバージョンに依存します。 – CommonsWare

+0

あなたは正しいです、Java SE 7から – ARP