2013-08-15 2 views
2

Привет и спасибо за вашу помощь.Почему я получаю java.lang.NullPointerException синтаксический анализ XML из URL? (и как это исправить?)

Я анализирую XML, который я извлекаю из URL.

Но когда я называю анализатору через несколько секунд я врезаться и получить java.lang.NullPointerException

В частности, это код:

public class AndroidXMLParsingActivity extends Activity { 

// All static variables 
static final String URL = "http://www.nation.co.ke/news.xml"; 
public ArrayList<Article> articoli; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ListView lv = (ListView) findViewById(R.id.list); 
    String xml = getXmlFromUrl(URL); 
    InputSource source = new InputSource(new StringReader(xml)); 

    try { 
     articoli = ReadXMLFileUsingSaxparser.parsa(source); 
    } catch (Exception e) { 
     Log.e("ERRROR", e.toString()); 
    } 
    ListAdapter adapter = new NewsAdapter(this, articoli); 
    lv.setAdapter(adapter); 
} 

public static String getXmlFromUrl(String url) { 
    String xml = null; 

    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     xml = EntityUtils.toString(httpEntity); 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // return XML 
    return xml; 
} 

} 

Ну ARTICOLI возвращает нуль образуют звонок в ReadXMLFileUsingSaxparser.parsa (источник)

Это код парсера.

public class ReadXMLFileUsingSaxparser extends DefaultHandler { 
private Article acct; 
private String temp; 
private static ArrayList<Article> accList = new ArrayList<Article>(); 
/** The main method sets things up for parsing */ 
public static ArrayList<Article> parsa(InputSource xml) throws IOException, SAXException, 
       ParserConfigurationException { 

     //Create a "parser factory" for creating SAX parsers 
     SAXParserFactory spfac = SAXParserFactory.newInstance(); 

     //Now use the parser factory to create a SAXParser object 
     SAXParser sp = spfac.newSAXParser(); 

     //Create an instance of this class; it defines all the handler methods 
     ReadXMLFileUsingSaxparser handler = new ReadXMLFileUsingSaxparser(); 

     //Finally, tell the parser to parse the input and notify the handler 
     sp.parse(xml, handler); 

     handler.readList(); 
    return accList; 

} 
/* 
* When the parser encounters plain text (not XML elements), 
* it calls(this method, which accumulates them in a string buffer 
*/ 
public void characters(char[] buffer, int start, int length) { 
     temp = new String(buffer, start, length); 
} 
/* 
* Every time the parser encounters the beginning of a new element, 
* it calls this method, which resets the string buffer 
*/ 
public void startElement(String uri, String localName, 
       String qName, Attributes attributes) throws SAXException { 
     temp = ""; 
     if (qName.equalsIgnoreCase("item")) { 
       acct = new Article(); 
     } 
} 
/* 
* When the parser encounters the end of an element, it calls this method 
*/ 
public void endElement(String uri, String localName, String qName) 
       throws SAXException { 
     if (qName.equalsIgnoreCase("item")) { 
       // add it to the list 
       accList.add(acct); 
     } else if (qName.equalsIgnoreCase("title")) { 
       acct.title=temp; 
     } else if (qName.equalsIgnoreCase("description")) { 
       acct.description=temp; 
     } else if (qName.equalsIgnoreCase("articleDate")) { 
      acct.articleDate=temp;   
     } else if (qName.equalsIgnoreCase("story")) { 
      acct.story=temp;    
     } else if (qName.equalsIgnoreCase("author")) { 
      acct.author=temp;   
     } else if (qName.equalsIgnoreCase("photo")) { 
      acct.photo=temp;    
     } else if (qName.equalsIgnoreCase("caption")) { 
      acct.caption=temp;   
     } else if (qName.equalsIgnoreCase("link")) { 
      acct.link=temp;    
     } else if (qName.equalsIgnoreCase("video")) { 
      acct.video=temp;    
     } 
} 

private void readList() { 
     Log.e("","No of the accounts in bank '" + accList.size() + "'."); 
     Iterator<Article> it = accList.iterator(); 
     int i=0; 
     while (it.hasNext()) { 
      Log.e("STORY " + Integer.toString(i),it.next().story); 
      i++; 
     } 
} 
} 
+0

пожалуйста отметьте строку с NullPointer исключения (смотреть на трассировки стека) и зафиксировать его, проверив, что wariable если есть нулевой –

+0

Если вы посмотрите на LogCat, то NullPointerException должен исходить из определенной линии в ReadXMLFileUsingSaxparser. Пожалуйста, сообщите нам, какая строка –

+0

@matheszabi благодарит, это поможет избежать краха, но это не решит проблему, потому что, естественно, мне нужен ArrayList «articoli» не должен быть пустым –

ответ

1
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ListView lv = (ListView) findViewById(R.id.list); 
    String xml = getXmlFromUrl(URL); 
    InputSource source = new InputSource(new StringReader(xml)); 

    try { 
     articoli = ReadXMLFileUsingSaxparser.parsa(source); 
    } catch (Exception e) { 
     Log.e("ERRROR", e.toString()); 
    } 
    if(articoli != null){ 
     ListAdapter adapter = new NewsAdapter(this, articoli); 
     lv.setAdapter(adapter); 
    } 
    else{ 
     // TODO: show message to the user about xml data is invalid or you have network connection error or so on 

     finish(); // return to the previous Activity. 
    } 
} 
+0

спасибо! Но опять же это не решает проблему, потому что мне нужно, чтобы «articoli» возвращался не null :-) –

+0

@ LisaAnne попытаться разобрать xml с сайта www.matheszabi.com/inexistent.xml, что вернет null или нет? где вы проверяете xml - ожидаемый формат или нет? –

+0

он дает Nullpointer, но в String xml = getXmlFromUrl (URL) действительно www.matheszabi.com/inexistent.xml не существует –

1

Я предполагаю, что вы работаете в NullPointer когда

try { 
    articoli = ReadXMLFileUsingSaxparser.parsa(source); 
} catch (Exception e) { 
    Log.e("ERRROR", e.toString()); 
} 

ListAdapter adapter = new NewsAdapter(this, articoli); 
lv.setAdapter(adapter); 

не удается, так что вы инициализировать ListView с адаптером то есть null. Просто инициализируйте ArticList articoli внутри блока catch, избегайте сбоев внутри Parser или выполните проверку = null.

+0

спасибо! Но опять же это не решает проблему, потому что мне нужно, чтобы «articoli» возвращался не null :-) –

+0

Ну, тогда вам нужно исправить метод .parsa(), чтобы он не возвращал значение null. –