2014-11-24 17 views
-4

我在處理java.lang.NullPointerException的方法和原因方面遇到了很多麻煩。我不知道發生了什麼,因爲它似乎發生在我的程序加載之前。我在我的onCreate函數的第一行設置了一個斷點,我的android日誌仍然顯示我有這個異常拋出,但程序繼續開始,我到達了我的斷點。但通過我得到非常奇怪的行爲。我將發佈有問題的代碼以及日誌。如果有任何其他信息需要幫助我,請詢問。請諒解。我是相當新的堆棧溢出onCreate之前的java.lang.NullPointerExeption爲Android應用程序調用

package com.example.facta.myapplication; 

import android.content.Context; 
import android.content.res.XmlResourceParser; 
import android.util.Log; 

import org.xmlpull.v1.XmlPullParser; 

import java.util.ArrayList; 
import java.util.Arrays; 

/** 
* Created by facta on 11/21/2014. 
*/ 
public class SiteConfig { 
    private XmlResourceParser configParser; 
    ArrayList<RSSProviderInfo> RSSProviderInfos; 
    ArrayList<String> RSSProviderNames; 

public SiteConfig() 
{ 
    RSSProviderInfos = new ArrayList<RSSProviderInfo>(); 
    RSSProviderNames = new ArrayList<String>(); 
} 

public ArrayList<RSSProviderInfo> getProvierInfos() 
{ 
    return RSSProviderInfos; 
} 
public ArrayList<String> getProvierNames() 
{ 
    return RSSProviderNames; 
} 

public void loadConfig(Context context, int resourceId) 
{ 
    configParser = context.getResources().getXml(resourceId); 
    RSSProviderInfos.clear(); 

    RSSProviderInfo providerInfo = new RSSProviderInfo(); 

    ArrayList<String> providerNames = loadProviders(configParser); 

    for(int i=0; i < providerNames.size(); i++) 
    { 
     providerInfo = LoadProviderInfo(configParser, providerNames.get(i)); 
     if(providerInfo != null && providerInfo.isComplete()) { 
      RSSProviderInfos.add(providerInfo); 
     } 
    } 
} 

private RSSProviderInfo LoadProviderInfo(XmlResourceParser parser, String provider) { 

    RSSProviderInfo info = new RSSProviderInfo(); 
    String attrName = new String(); 

    try { 
     parser.next(); 
     int eventType = parser.getEventType(); 
     while (eventType != XmlPullParser.END_DOCUMENT) { 
      if (eventType == XmlPullParser.START_TAG 
        && parser.getName().equalsIgnoreCase("site")) { 

       attrName = parser.getAttributeValue(null, "name"); 

       if(attrName.equalsIgnoreCase(provider + ".enabled")) 
       { 
        /* 
        String value = parser.getAttributeValue(null, "value"); 
        if(value.equalsIgnoreCase("no")) { 
         Log.d("LoadProviderInfo", "value does equal no"); 
         return null; //If it's not enabled don't include it in the config 
        } 
        */ 
       } 
       else if(attrName.equalsIgnoreCase(provider + ".elementTag")) 
       { 
        info.setElementTag(parser.getAttributeValue(null, "value")); 
       } 
       else if(attrName.equalsIgnoreCase(provider + ".titleTag")) 
       { 
        info.setTitleTag(parser.getAttributeValue(null, "value")); 
       } 
       else if(attrName.equalsIgnoreCase(provider + ".linkTag")) 
       { 
        info.setLinkTag(parser.getAttributeValue(null, "value")); 
       } 
       else if(attrName.equalsIgnoreCase(provider + ".descriptionTag")) 
       { 
        info.setDescriptionTag(parser.getAttributeValue(null,"value")); 
       } 
       else if(attrName.equalsIgnoreCase(provider + ".url")) 
       { 
        info.addUrl(parser.getAttributeValue(null, "value")); 
       } 
       break; 
      } 
      eventType = parser.next(); 
     } 
    } 
    catch (Exception e) 
    { 
     Log.d("loadProviderInfo", "Caught an exeption: " + e.toString() + e.getMessage()); 
     e.printStackTrace(); 
     StackTraceElement st[] = e.getStackTrace(); 
     for(int i=0; i < st.length; i++) 
     { 
      Log.d("loadProviderInfo", "StackTraceElement[" + i + "] " + st[i].getLineNumber()); 

     } 
    } 



    return null; 
} 

private ArrayList<String> loadProviders(XmlResourceParser parser) { 

    ArrayList<String> names = new ArrayList<String>(); 

    try { 
     parser.next(); 
     int eventType = parser.getEventType(); 
     while (eventType != XmlPullParser.END_DOCUMENT) { 
      if (eventType == XmlPullParser.START_TAG 
        && parser.getName().equalsIgnoreCase("siteproviders")) { 

       String[] parsedNames = parser.getAttributeValue(null, "value").split(","); 

       for (int i=0; i < parsedNames.length; i++) 
       { 
        names.add(i, parsedNames[i]); 
       } 
       break; 
      } 
      eventType = parser.next(); 
     } 
    } 
    catch (Exception e) 
    { 
     Log.d("loadProviderInfo", "Caught an exeption: " + e.toString() + e.getMessage()); 
     e.printStackTrace(); 
     StackTraceElement st[] = e.getStackTrace(); 
     for(int i=0; i < st.length; i++) 
     { 
      Log.d("loadProviderInfo", "StackTraceElement[" + i + "] " + st[i].getLineNumber()); 

     } 

    } 

    return names; 
} 


} 

登錄下面

11-23 18:20:40.830  537-537/com.example.facta.myapplication D/dalvikvm﹕ Not late-enabling CheckJNI (already on) 
11-23 18:20:41.569  537-542/com.example.facta.myapplication I/dalvikvm﹕ threadid=3: reacting to signal 3 
11-23 18:20:41.580  537-542/com.example.facta.myapplication I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 
11-23 18:20:42.040  537-537/com.example.facta.myapplication D/loadProviders﹕ Caught an exeption: java.lang.NullPointerException 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ java.lang.NullPointerException 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at com.example.facta.myapplication.SiteConfig.loadProviders(SiteConfig.java:119) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at com.example.facta.myapplication.SiteConfig.loadConfig(SiteConfig.java:42) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at com.example.facta.myapplication.ResultsActivity.fetch(ResultsActivity.java:94) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at com.example.facta.myapplication.ResultsActivity.onCreate(ResultsActivity.java:62) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.app.Activity.performCreate(Activity.java:4465) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.app.ActivityThread.access$600(ActivityThread.java:123) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4424) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-23 18:20:42.040  537-537/com.example.facta.myapplication W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 
11-23 18:20:42.070  537-542/com.example.facta.myapplication I/dalvikvm﹕ threadid=3: reacting to signal 3 
11-23 18:20:42.080  537-542/com.example.facta.myapplication I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 
11-23 18:20:42.270  537-537/com.example.facta.myapplication D/gralloc_goldfish﹕ Emulator without GPU emulation detected. 
11-23 18:37:36.440  669-669/com.example.facta.myapplication W/ActivityThread﹕ Application com.example.facta.myapplication is waiting for the debugger on port 8100... 
11-23 18:37:36.490  669-669/com.example.facta.myapplication I/System.out﹕ Sending WAIT chunk 
11-23 18:37:36.701  669-675/com.example.facta.myapplication I/dalvikvm﹕ Debugger is active 
11-23 18:37:36.740  669-669/com.example.facta.myapplication I/System.out﹕ Debugger has connected 
11-23 18:37:36.740  669-669/com.example.facta.myapplication I/System.out﹕ waiting for debugger to settle... 
11-23 18:37:36.900  669-674/com.example.facta.myapplication I/dalvikvm﹕ threadid=3: reacting to signal 3 
11-23 18:37:36.910  669-674/com.example.facta.myapplication I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 
11-23 18:37:36.940  669-669/com.example.facta.myapplication I/System.out﹕ waiting for debugger to settle... 
11-23 18:37:37.140  669-669/com.example.facta.myapplication I/System.out﹕ waiting for debugger to settle... 
11-23 18:37:37.680  669-669/com.example.facta.myapplication I/System.out﹕ waiting for debugger to settle... 
11-23 18:37:37.880  669-669/com.example.facta.myapplication I/System.out﹕ waiting for debugger to settle... 
11-23 18:37:38.079  669-669/com.example.facta.myapplication I/System.out﹕ waiting for debugger to settle... 
11-23 18:37:38.279  669-669/com.example.facta.myapplication I/System.out﹕ waiting for debugger to settle... 
11-23 18:37:38.369  669-674/com.example.facta.myapplication I/dalvikvm﹕ threadid=3: reacting to signal 3 
11-23 18:37:38.379  669-674/com.example.facta.myapplication I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 

調用活動下方

package com.example.facta.myapplication; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 

import java.util.ArrayList; 

/* TODO 
    Need to make a config file that has the following format. 
    site.names   = CNN,FOX,NBC,AP 

    site.CNN.enabled = yes 
    site.CNN.searchtag = item 
    site.CNN.titletag = title 
    site.CNN.linktag = link 
    site.CNN.descriptiontag = description 
    site.CNN.numurls = 10 
    site.CNN.url.1  = "https://www.cnn.com/top_stories.rss 
    site.CNN.url.2  = "https://www.cnn.com/world_politics.rss 

    site.FOX.enabled = no 
    site.FOX.searchtag = story 

*/ 



public class ResultsActivity extends Activity { 

private ArrayList<String> finalUrls = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_results); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_topstories.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_world.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_us.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/money_latest.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_allpolitics.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_crime.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_tech.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_health.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_showbiz.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_travel.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_living.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_freevideo.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_studentnews.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_mostpopular.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_latest.rss"); 
    finalUrls.add("http://rss.ireport.com/feeds/oncnn.rss"); 
    finalUrls.add("http://rss.cnn.com/rss/cnn_behindthescenes.rss"); 
    this.fetch(); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_results, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private void fetch() { 
    /**TODO possibly load config then for each provider pass in RSSProviderInfo into HandleXML 
    That way HandleXML can set all the tags it needs and then parse the urls from the param 
    */ 

    SiteConfig siteConfig = new SiteConfig(); 
    siteConfig.loadConfig(this, R.xml.sites); 
    ArrayList<RSSProviderInfo> siteConfigProvierInfos = siteConfig.getProvierInfos(); 

    for (int k = 0; k < siteConfigProvierInfos.size(); k++) { 

     HandleXML obj = new HandleXML(siteConfigProvierInfos.get(k)); 
     obj.fetchXML(); 

     while (!obj.parsingComplete) { 
      try { 
       Thread.sleep(500, 0); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      final ArrayList<RSSInfo> rssInfos = obj.getRssInfos(); 
      final TableLayout tableLayout = (TableLayout) findViewById(R.id.results_table); 

      Log.d("fetch", "Size of rssinfos " + rssInfos.size()); 

      for (int i = 0; i < rssInfos.size(); i++) { 
       final int index = i; 
       final TableRow tableRow = new TableRow(this); 
       tableRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT)); 

       //Get information from infos 
       final TextView textView = new TextView(this); 
       textView.setText(rssInfos.get(index).getTitle()); 
       textView.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); 

       tableRow.setClickable(true); 
       tableRow.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(rssInfos.get(index).getLink())); 
         startActivity(intent); 
        } 
       }); 

       tableRow.addView(textView); 
       tableLayout.addView(tableRow); 

      } 

      Log.d("fetch", "tableLayout = " + tableLayout.toString()); 

     } 

    } 

} 
} 
+0

什麼是「SiteConfig」的第119行。它看起來像是你的問題。 '解析器'可能嗎? – codeMagic 2014-11-24 21:08:15

+0

'ArrayList names = new ArrayList ();'感謝您的幫助。這是SiteConfig的第119行。不知道這是否是問題,因爲它看起來很簡單。 – 2014-11-24 21:16:17

+2

你確定嗎?因爲這條線不能產生NPE。你是否如上所述檢查了'parser'變量? – codeMagic 2014-11-24 21:17:53

回答

0

很抱歉的混亂。我想我需要查看Android Studio。這是我的代碼以前版本的錯誤(注意昨天11-23的日期)。我認爲logcat中的「清除所有」字面上全部清除並刪除它。我剛剛發現我錯了。目前沒有NPE,我知道。對不起浪費時間....使用android studio學到的教訓。在注意到這之後,我能夠找到導致程序很快退出的邏輯錯誤。感謝所有的幫助

相關問題