【问题标题】:Weird logcat: How to fix?奇怪的logcat:如何解决?
【发布时间】:2013-10-21 03:27:50
【问题描述】:

使用此代码查看 Busybox 的版本

public Stringbusybox_v() 抛出 IOException {

Process p =Runtime.getRuntime().exec("busybox");
    InputStream a = p.getInputStream();
    InputStreamReader read = new InputStreamReader(a);
    BufferedReader in = new BufferedReader(read);
    StringBuilder buffer = new StringBuilder();

    String line = null;

    try {

        while ((line = in.readLine()) != null) {
            buffer.append(line);
        }

    } finally {
        read.close();
        in.close();
    }

    String result = buffer.toString().substring(0, 15);
    return result;

}

在大多数手机上运行良好,但在 Nexus 4 中,他们向我发送了这个 logcat

java.lang.StringIndexOutOfBoundsException: 长度=0;区域开始=0; 在 java.lang.String.startEndAndLength(String.java:583) 处的 regionLength=15 在 java.lang.String.substring(String.java:1464) 在 com.MyPackage.MyApplicationName.Root.busybox_v(Root.java:98) 在 com.MyPackage.MyApplicationName.PageFragment$1.onClick(PageFragment.java:101) 在 android.view.View.performClick(View.java:4240) 在 android.view.View$PerformClick.run(View.java:17721) 在 android.os.Handler.handleCallback(Handler.java:730) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5103) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在 de.robv.android.xposed.XposedBridge.main(XposedBridge.java:110) 在 dalvik.system.NativeStart.main(Native Method)

第 98 行对应于 while 的右大括号。我不明白如何解决这个问题。有什么帮助吗?

【问题讨论】:

  • buffer 可能不包含 16 个字符(注:at java.lang.String.substring)。
  • 您不能在大括号上获得异常。请仔细检查行号,或者您正在执行您认为的代码。
  • 可能,关于如何解决这个问题的想法?在 Activity 中,我在 try-catch (IOExcepetion e) 中运行此方法
  • @SimonePiglietti 使用015 检查buffer 长度是否对substring 有效。

标签: java android xml string stringbuffer


【解决方案1】:

您的问题很可能是您的 StringBuffer 没有 16 个字符。你可以试试这样的:

String result = buffer.toString().substring(0, Math.min(buffer.length()-1,15));

要知道更多,问题变成了结果试图做什么?如果它是十六进制代码,那么在这种情况下,您可能应该在前面附加 0。如果它是一个字符串,可能会附加空格。底线是,如果您没有输入 16 个字符,您应该弄清楚该怎么做,并采取适当的行动。这可以通过以下方式完成:

if (buffer.length()>=16)
{
    String result = buffer.toString().substring(0, 15);
}
else
{
    //Do something here to manage the exception
}

【讨论】:

  • 这将防止异常,但可能会破坏逻辑并导致程序的错误行为。如果15 是评论家,我更喜欢if 并手动检查它是否会超过buffer 长度。
  • @MarounMaroun:好点。添加了关于在字符数不足时如何处理的说明。
  • 运行命令busybox,前16个字符作为结果返回“Busybox v1.21.1”,然后取前16个字符我得到版本。对我该怎么做有更好的想法?
  • 您正在尝试读取版本号?我会做某种正则表达式来获取版本号,或者只是查找字符 v 并阅读以下内容。不过,在我看来,我只想问一个关于如何最好地做到这一点的单独问题,重点是字符串、语言和所需的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2017-12-30
  • 2021-07-24
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多