2012-04-28 38 views
0

我正在使用sax解析器獲取xml數據,下面的代碼導致我的應用程序崩潰。英雄Sax錯誤

try { 
     url = new URL("The URL"); 
    } catch (MalformedURLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    // RssFeed feed = null; 
    try { 
     feed = RssReader.read(url); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

看起來是在feed = RssReader.read(url);崩潰它適用於我的EVO罰款,但是當我在我的英雄安裝出現以下錯誤

04-28 15:57:53.458: E/AndroidRuntime(2749): Uncaught handler: thread main exiting due to uncaught exception 
04-28 15:57:53.589: E/AndroidRuntime(2749): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mlgw.mlgwapp/com.mlgw.mlgwapp.TipsActivity}: java.lang.StringIndexOutOfBoundsException 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:2411) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:648) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.widget.TabHost.setCurrentTab(TabHost.java:320) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:129) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:379) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.View.performClick(View.java:2364) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.View.onTouchEvent(View.java:4179) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.View.dispatchTouchEvent(View.java:3709) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.Activity.dispatchTouchEvent(Activity.java:2068) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1697) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.os.Looper.loop(Looper.java:123) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.ActivityThread.main(ActivityThread.java:4595) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at dalvik.system.NativeStart.main(Native Method) 
04-28 15:57:53.589: E/AndroidRuntime(2749): Caused by: java.lang.StringIndexOutOfBoundsException 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at java.lang.String.substring(String.java:1646) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at nl.matshofman.saxrssreader.RssHandler.endElement(RssHandler.java:67) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at org.apache.harmony.xml.ExpatParser.endElement(ExpatParser.java:159) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at org.apache.harmony.xml.ExpatParser.append(Native Method) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:506) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at nl.matshofman.saxrssreader.RssReader.read(RssReader.java:43) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at com.mlgw.mlgwapp.TipsActivity.onCreate(TipsActivity.java:57) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-28 15:57:53.589: E/AndroidRuntime(2749):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544) 

請幫助!

這裏是我RssHandler類

package nl.matshofman.saxrssreader; 

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

import org.xml.sax.Attributes; 
import org.xml.sax.helpers.DefaultHandler; 

public class RssHandler extends DefaultHandler { 

private RssFeed rssFeed; 
private RssItem rssItem; 
private StringBuilder stringBuilder; 

@Override 
public void startDocument() { 
    rssFeed = new RssFeed(); 
} 

/** 
* Return the parsed RssFeed with it's RssItems 
* @return 
*/ 
public RssFeed getResult() { 
    return rssFeed; 
} 

@Override 
public void startElement(String uri, String localName, String qName, Attributes attributes) { 
    stringBuilder = new StringBuilder(); 

    if(qName.equals("item") && rssFeed != null) { 
     rssItem = new RssItem(); 
     rssItem.setFeed(rssFeed); 
     rssFeed.addRssItem(rssItem); 
    } 
} 

@Override 
public void characters(char[] ch, int start, int length) { 
    stringBuilder.append(ch, start, length); 
} 

@Override 
public void endElement(String uri, String localName, String qName) { 

    if(rssFeed != null && rssItem == null) { 
     // Parse feed properties 

     try { 
      String methodName = "set" + qName.substring(0, 1).toUpperCase() + qName.substring(1); 
      Method method = rssFeed.getClass().getMethod(methodName, String.class); 
      method.invoke(rssFeed, stringBuilder.toString()); 
     } catch (SecurityException e) { 
     } catch (NoSuchMethodException e) { 
     } catch (IllegalArgumentException e) { 
     } catch (IllegalAccessException e) { 
     } catch (InvocationTargetException e) { 
     } 

    } else if (rssItem != null) { 
     // Parse item properties 

     try { 
      if(qName.equals("content:encoded")) 
       qName = "content"; 
      String methodName = "set" + qName.substring(0, 1).toUpperCase() + qName.substring(1); 
      Method method = rssItem.getClass().getMethod(methodName, String.class); 
      method.invoke(rssItem, stringBuilder.toString()); 
     } catch (SecurityException e) { 
     } catch (NoSuchMethodException e) { 
     } catch (IllegalArgumentException e) { 
     } catch (IllegalAccessException e) { 
     } catch (InvocationTargetException e) { 
     } 
    } 

} 

} 好,我補充說,現在有這個

04-28 18:49:35.189: E/AndroidRuntime(3780): Uncaught handler: thread main exiting due to uncaught exception 
04-28 18:49:35.328: E/AndroidRuntime(3780): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mlgw.mlgwapp/com.mlgw.mlgwapp.TipsActivity}: java.lang.IllegalArgumentException 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:2411) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:648) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.widget.TabHost.setCurrentTab(TabHost.java:320) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:129) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:379) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.View.performClick(View.java:2364) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.View.onTouchEvent(View.java:4179) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.View.dispatchTouchEvent(View.java:3709) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.Activity.dispatchTouchEvent(Activity.java:2068) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1697) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.os.Looper.loop(Looper.java:123) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.ActivityThread.main(ActivityThread.java:4595) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at dalvik.system.NativeStart.main(Native Method) 
04-28 18:49:35.328: E/AndroidRuntime(3780): Caused by: java.lang.IllegalArgumentException 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at java.util.Random.nextInt(Random.java:221) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at com.mlgw.mlgwapp.TipsActivity.onCreate(TipsActivity.java:71) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544) 
04-28 18:49:35.328: E/AndroidRuntime(3780):  ... 30 more 

現在似乎已經somethig做我使用的圓形功能。

+0

您需要發佈您的RssHandler類的代碼。 – superfell 2012-04-28 21:17:19

回答

1

堆棧跟蹤告訴你錯誤的原因:java.lang.String.substring()發生

Caused by: java.lang.StringIndexOutOfBoundsException 
    at java.lang.String.substring(String.java:1646) 
    at nl.matshofman.saxrssreader.RssHandler.endElement(RssHandler.java:67) 

實際的錯誤,是不是你的代碼,所以你不能修復任何那裏。但下一行會告訴你substring被調用的地方。 RssHandler.java在67行,在方法endElement

這應該是:等你訪問qName雖然是空的

String methodName = "set" + qName.substring(0, 1).toUpperCase() + qName.substring(1) 

字符串索引都是自己的角色,你不能只在第一個字符建立一個子或從第一個字符開始。

爲了防止你可以做

if (qName != null && qName.length() > 0) { 
    String methodName = "set" + qName.substring(0, 1).toUpperCase() + qName.substring(1); 
    Method method = rssFeed.getClass().getMethod(methodName, String.class); 
    method.invoke(rssFeed, stringBuilder.toString()); 
} 

崩潰,你應該看看XML並找出爲什麼會出現不符合預期格式的QNAME。

另外localName可能更好檢查,因爲<xsl:template />的限定名稱是xsl:template,而本地名稱只是template