2016-03-31 2 views
0

Мне нужна небольшая помощь здесь. Я пытаюсь использовать AsyncTask (Learning). Когда я запускаю приложение, я получаю ошибку Fatal Exception для AsyncTask # 1, вызванную исключением нулевого указателя. Он сказал, что это произошло во время выполнения doInBackground. Это классAndroid. Неустранимое исключение: AsyncTask # 1

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

Это ошибка, я получаю

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, потому что вы никогда не присвоить ему значение. Если вы хотите избежать NullPointerException, не вызывайте add() по адресу newsList, пока вы не назначили значение newsList (например, newsList=new ArrayList<HashMap<String, Object>>();).

+0

Ответ CommonsWare правильный, но я думаю, что инициализация избыточна, newsList = new ArrayList <>(); достаточно – ARP

+1

@ARP: Это зависит от версии Java. – CommonsWare

+0

Вы правы, от Java SE 7 – ARP

Смежные вопросы