由子串

时间:2018-04-07 02:14:19

标签: android string substring

我在Google Play控制台中收到了此崩溃报告,我自己从未体验过。

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2505)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2577)
  at android.app.ActivityThread.access$1000 (ActivityThread.java:164)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1462)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:160)
  at android.app.ActivityThread.main (ActivityThread.java:5541)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:964)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:759)
Caused by: java.lang.StringIndexOutOfBoundsException: 
  at java.lang.String.startEndAndLength (String.java:504)
  at java.lang.String.substring (String.java:1333)
  at .Word.onCreate (Word.java)
  at android.app.Activity.performCreate (Activity.java:6093)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1106)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2458)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2577)
  at android.app.ActivityThread.access$1000 (ActivityThread.java:164)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1462)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:160)
  at android.app.ActivityThread.main (ActivityThread.java:5541)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:964)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:759)

此崩溃报告未提及Word.java类的哪一行导致问题。在我的课堂上,我使用以下substring方法。

definition = defn.substring(0, defn.indexOf("@"));
sentence = rawMeaning.substring(rawMeaning.lastIndexOf('@') + 1);

我的defn字符串示例为test1@test2test1@。我的defn字符串字符串中的每一个都包含@。某些字符串包含@之后的字符,有些字符串不包含@之后的任何字符。我的rawMeaning字符串与我的defn字符串共享一个类似的格式。

有趣的是,我收到了另一个崩溃报告,该报告给出了类似的错误,但它提到错误导致了我的应用结算,StringIndexOutOfBoundsException caused by in app billing queryInventoryAsync

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您绝对100%确定所有字符串都包含“@”字符吗?正如你没有表明的那样,这仍然是最可能的原因。实际上,使用您显示的代码,可能的解释是您的代码正在处理字符串而不此字符。

我建议您发布一个新版本的应用,以便在出现此错误时提供诊断信息。试试这个:

更改

definition = defn.substring(0, defn.indexOf("@"));

 try {
    definition = defn.substring(0, defn.indexOf("@"));
 } catch (Exception ex) {
    String message = "Error processing string: (" + defn + ")";
    throw new RuntimeException(message, ex);
 } 

然后,当应用程序下次崩溃时,崩溃日志将包含一个堆栈跟踪,其中会显示一条消息,告诉您哪个字符串导致了问题。

答案 1 :(得分:0)

  

如果你确定最多得到两个单词,请尝试选择“拆分”而不是找到“subString”。

您的代码:

definition = defn.substring(0, defn.indexOf("@"));
sentence = rawMeaning.substring(rawMeaning.lastIndexOf('@') + 1);

试用:

String[] words = defn.split("@);
definition =words[0];
sentence = words.length>1? words[1] : "";