2014-09-27 4 views
0

Я пытаюсь разобрать новостной канал BBC с PullParser, но он рушится для некоторых из-за NullPointerExeception, и я не могу понять, почему.Ошибка приложения Android при попытке разбора XML

Существует также два тега заголовка перед фактическим первым тегом заголовка, который я хочу проанализировать, и одним тегом описания перед тем, который я должен разобрать, и я не совсем уверен, что правильно обрабатываю это, но даже если это не так, Я не думаю, что это вызывает проблему, но я могу ошибаться.

Спасибо, кто смотрит на это!

EDIT: Я использую nextText() вместо getText()

Ниже приведен PullParser код

static public class NewsItemPullParser{ 

    static ArrayList<NewsItems> parseNewsItems(InputStream in) throws XmlPullParserException, IOException{ 
     XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); 
     parser.setInput(in, "UTF-8"); 
     NewsItems newsItem = null; 
     ArrayList<NewsItems> newsList = new ArrayList<NewsItems>(); 
     int event = parser.getEventType(); 

     while(event != XmlPullParser.END_DOCUMENT){ 

      switch(event){ 
      case XmlPullParser.START_TAG: 

       if(parser.getName().equals("title")){ 
        if(!parser.getText().trim().contains("BBC News -")){ 
         newsItem = new NewsItems(); 
         newsItem.setTitle(parser.getText().trim()); 
         Log.d("Title", parser.getText().trim()); 
        } 
       }else if(parser.getName().equals("description")){ 
        if(!parser.getText().trim().contains("The latest stories")){ 
         newsItem.setDescritpion(parser.getText().trim()); 
         Log.d("description", parser.getText().trim()); 
        } 
       }else if(parser.getName().equals("pubDate")){ 
        newsItem.setPubDate(parser.getText().trim()); 
       }else if(parser.getName().equals("media:thumbnail")){ 
        if(parser.getAttributeValue(null, "width").equals("66")){ 
         newsItem.setThmnSmall(parser.getAttributeValue(null, "url").trim()); 
         Log.d("small thumbnail", parser.getAttributeValue(null, "url").trim()); 
        } 
       }else if(parser.getName().equals("media:thumbnail")){ 
        if(parser.getAttributeValue(null, "width").equals("144")){ 
         newsItem.setThmnLarge(parser.getAttributeValue(null, "url").trim()); 
         Log.d("large thumbnail", parser.getAttributeValue(null, "url").trim()); 
        }  
       } 

       break; 
      case XmlPullParser.END_TAG: 
       if(parser.getName().equals("title")){ 
        newsList.add(newsItem); 
        newsItem = null; 
       } 

      default: 
       break; 
      } 
      event = parser.next(); 

     } 
     return newsList; 
    } 

Вот это AsyncTask код:

public class GetNewsAsyncTask extends AsyncTask<String, Void, ArrayList<NewsItems>> { 
NewsActivity activity; 

public GetNewsAsyncTask(NewsActivity activity){ 
    this.activity = activity; 

} 

@Override 
protected ArrayList<NewsItems> doInBackground(String... params) { 

    try { 
     URL url = new URL(params[0]); 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
     con.setRequestMethod("GET"); 
     con.connect(); 
     int statusCode = con.getResponseCode(); 
     if(statusCode == HttpURLConnection.HTTP_OK){ 
      InputStream in = con.getInputStream(); 
      return NewsUtil.NewsItemPullParser.parseNewsItems(in); 
     } 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     return null; 
} 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
    //NewsActivity.pd.show(); 
} 

@Override 
protected void onPostExecute(ArrayList<NewsItems> result) { 
    super.onPostExecute(result); 
    //NewsActivity.pd.dismiss(); 
} 



} 

Здесь ошибка журнала:

09-27 03:36:25.594: E/AndroidRuntime(1720): FATAL EXCEPTION: AsyncTask #1 
09-27 03:36:25.594: E/AndroidRuntime(1720): java.lang.RuntimeException: An error occured while executing doInBackground() 
09-27 03:36:25.594: E/AndroidRuntime(1720): at  android.os.AsyncTask$3.done(AsyncTask.java:299) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at java.lang.Thread.run(Thread.java:856) 
09-27 03:36:25.594: E/AndroidRuntime(1720): Caused by: java.lang.NullPointerException 
09-27 03:36:25.594: E/AndroidRuntime(1720): at com.example.bbcnewsapp.NewsUtil$NewsItemPullParser.parseNewsItems(NewsUtil.java:34) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at com.example.bbcnewsapp.GetNewsAsyncTask.doInBackground(GetNewsAsyncTask.java:34) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at com.example.bbcnewsapp.GetNewsAsyncTask.doInBackground(GetNewsAsyncTask.java:1) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
09-27 03:36:25.594: E/AndroidRuntime(1720): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
09-27 03:36:25.594: E/AndroidRuntime(1720): ... 4 more 
09-27 03:36:27.726: I/Process(1720): Sending signal. PID: 1720 SIG: 9 
+0

Где находится строка 34 'NewsUtil.java'? –

+0

'return NewsUtil.NewsItemPullParser.parseNewsItems (in);' в коде 'AsyncTask'.Я думаю, что это сбой, потому что он возвращает пустой список, потому что что-то не так с синтаксическим разбором. Даже если я попытаюсь записать самый первый 'parser.getText()', я ничего не получаю. – WeVie

+0

Это выглядит в строке 34 из 'GetNewsAsyncTask.java'. Но ошибка возникает в строке 34 'NewsUtil.java' ** внутри ** вызова' parseNewsItems() '. Какая строка это? –

ответ

1
if(!parser.getText().trim().contains("BBC News -")) 

Это имеет по крайней мере три возможных причины в NullPointerException:

  1. parser является null.

  2. getText() возвращает null

  3. trim() возвращает null

Вы инициализировать parser с XmlPullParserFactory.newInstance().newPullParser(), который, вероятно, гарантированно возвращает ненулевое ссылку. Предполагая, что getText() возвращает String, 3 невозможно. Это оставляет первые два. Это оставляет 2 в качестве наиболее разумного подозреваемого.

Обратите внимание, что вы все равно должны проверить 1 и 3, чтобы быть в безопасности. Вы можете сделать это, разбив условие if на отдельные операторы, чтобы проверить каждое возвращаемое значение.

Как только вы найдете значение null, вам нужно будет выяснить, почему это null, когда вы ожидаете иначе.

Добавление:

Из документации XmlPullParser:

The method next() advances the parser to the next event. The int value returned from next determines the current parser state and is identical to the value returned from following calls to getEventType().

Th[e] following event types are seen by next()

START_TAG An XML start tag was read.

TEXT Text content was read; the text content can be retrieved using the getText() method. (when in validating mode next() will not report ignorable whitespace, use nextToken() instead)

END_TAG An end tag was read

END_DOCUMENT No more events are available

Таким образом, кажется, что вам нужно вызвать next() снова перед вызовом getText(), чтобы получить текст внутри тега.

+0

После тестирования это 'getText()' равно null. Когда я также тестировал 'getName()', я получил правильный тег, который я искал, который является '' XML-тег выглядит так: '<title> BBC News - Home' so 'getText()' должен быть правильным способ правильно захватить этот текст? – WeVie

+1

ПОДОЖДИТЕ !!! Я снова посмотрел документацию, и это не 'getText()'. Это должно быть 'nextText()' Теперь это довольно неприятно. – WeVie

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