【问题标题】:Splitting a string from API into two parts starting from a bracket将 API 中的字符串拆分为从括号开始的两部分
【发布时间】:2020-03-27 07:39:08
【问题描述】:

我有一个方法可以检查从 API 生成的引用是否在 130 个字符内,然后将其分成两部分,前面部分是引用,第二部分是作者。

API 引用的 html 输出是:(例如)“言辞中的善意创造信心。(老子)”

我想在两个单独的文本视图中显示它们并删除括号。 文本视图 1 - 报价 Textview 2 - 作者(去掉括号)

很遗憾,应用程序有时会崩溃并显示 IndexOutOfBoundsException,有没有其他方法可以做到这一点?

先谢谢你了。

private void check(String quote){

        //check length
        int length = quote.length();

        if (length <= 130) {

            //split to quote and author strings
            String[] parts = quote.split(Pattern.quote("(")); // Split on ( into 2 parts, quote and author
            String part1 = parts[0]; //quote
            String part2 = parts[1]; //author with )

            String removedSymbolsPart2 = part2.replaceAll("\\)", ""); //remove ) symbol

            String finalQuote = Html.fromHtml(part1).toString();
            String finalAuthor = Html.fromHtml(removedSymbolsPart2).toString();

            quoteTextViewMain.setText(finalQuote);
            authorTextViewMain.setText(finalAuthor);

        } else {
            //get another quote
            getQuote();
        }
    }

索引超出范围错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.amethyst.secretgarden, PID: 21802
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
        at com.amethyst.secretgarden.MainActivity.check(MainActivity.java:83)
        at com.amethyst.secretgarden.MainActivity.access$000(MainActivity.java:24)
        at com.amethyst.secretgarden.MainActivity$4.success(MainActivity.java:106)
        at com.amethyst.secretgarden.MainActivity$4.success(MainActivity.java:103)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$7.invoke(Deserializable.kt:150)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$7.invoke(Unknown Source:4)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$asyncRequest$1$1.invoke(Deserializable.kt:192)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$asyncRequest$1$1.invoke(Unknown Source:0)
        at com.github.kittinunf.fuel.core.RequestExecutionOptionsKt$sam$java_lang_Runnable$0.run(Unknown Source:2)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:226)
        at android.app.ActivityThread.main(ActivityThread.java:7231)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:500)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:913)
I/Process: Sending signal. PID: 21802 SIG: 9

【问题讨论】:

  • 您是否尝试过调试您的代码?
  • @Amongalen 你的意思是运行-> 调试应用程序吗?我做到了,它有时仍然崩溃并显示 ArrayIndexoutofboundsexception ..
  • 嗨,你应该在拆分之前检查引号是否包含括号......另外我不知道你的“Html”类是什么。
  • @user2447161 嗨,关于“Html.html()”,我用它来将 html 从更改为字符串以在 textview 中显示,如下所示: textView.setText(Html.fromHtml("标题

    此处描述

    ", Html.FROM_HTML_MODE_COMPACT));

标签: java android string indexoutofboundsexception


【解决方案1】:

我会用

String [] parts = quote.split ("(");  // no pattern neeeded
if (parts.length > 1) {
     String part1 = parts[0]; //quote
     String part2 = parts[1]; //author with )

     String removedSymbolsPart2 = part2.replace(")", "");  // not replaceAll
}

【讨论】:

  • 对不起,我改变了变量名来匹配你的,忘记了那部分。
【解决方案2】:
 String tmp = "Kindness in words creates confidence. (Lao Tzu)";

 int index1 = tmp.indexOf("(");
 int index2 = tmp.indexOf(")");

 if(index1 > 0 && index2 > 0){
 String Author = tmp.substring(index1+1,index2);
 String quote  = tmp.substring(0,index1);
 System.out.println(Author);
 System.out.println(quote);
 } 

输出

Lao Tzu
Kindness in words creates confidence. 

【讨论】:

  • 非常感谢您的帮助!我试试看:)
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多