0

コマンド「busybox」の実行から取得した出力で最初の16文字を取得するこのメソッドがあります

public String busybox_v() throws 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();
        }

        if (buffer.length()>=16)
        {
            String result = buffer.toString().substring(0, 15);

        }
        else
        {

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

以前、私はこのクラッシュを経験しました

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

行 98 は、while の右中括弧に対応します。ユーザーからのアドバイスのおかげで、Overloflow をスタックするようにしました。長さが実際に 16 文字以上であるかどうかをチェックする if-else を配置し、アプリケーションをクラッシュさせません。しかし、現在のコードでは、別のクラスにこのコードがあるため、アプリケーションはまったく同じようにクラッシュします

try {

String myResult=root.busybox_v();  
if(myResult!=null&&myResult.length()>0) {

    TextView1.setText(Html.fromHtml(("<b><font color=\"#009900\">"+myResult+"</font></b>")));


}
else {

}
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}



            }
        );

これを修正する方法についてのアイデアはありますか?

4

2 に答える 2

0
 if (buffer.length()>=16)
 {
     String result = buffer.toString().substring(0, 15);

 }
 else
 {

 }
 String result = buffer.toString().substring(0, 15); // this is the problem line
 return result; 

が 16 未満の場合buffer.length、コメントでマークした行が実行され、バッファー長が 15 未満の場合は失敗します。

あなたの論理はどこか間違っています。バッファ長が 16 未満になるように変更する必要があります。

于 2013-10-14T13:39:07.407 に答える
0

これを変える

if (buffer.length()>=16)
{
    String result = buffer.toString().substring(0, 15);
}
else
{
}
String result = buffer.toString().substring(0, 15);

String result = "";

if (buffer.length()>=16)
{
    result = buffer.toString().substring(0, 15);
}
else
{
    result = buffer.toString();
}

return result;

長さが 16 文字未満の場合、これは文字列全体を返します。

于 2013-10-14T13:41:44.927 に答える