字符串异常

时间:2014-12-12 07:34:08

标签: java android string

我在解码字符串模式a-695b-36c158d-666e-1326f144时得到一个超出绑定异常的字符串索引。我想在一个&之间提取值。 b,b& c,c& d。

此代码有时会正确打印值,但有时会失败。我不明白为什么有时会发生这种异常。

以下是我的代码:

       public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[128];
        int bytes;

        // Keep listening to the InputStream while connected
        while (true) {
            try {

                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                int buflen=buffer.length;
                String str = new String(buffer, "UTF-8"); // prints character
                Log.d("Data Transmitted", str);
                int spaceIndex = str.indexOf(" ");
                if (spaceIndex != -1)
                {
                    str = str.substring(0, spaceIndex);
                }
                Log.d("Data Edited", str);

                boolean v1=str.contains("a");                   
                boolean v2=str.contains("b");
                boolean v3=str.contains("c");
                boolean v4=str.contains("d");
                if(v1==true && v2==true && v3==true && v4==true){

                mEmulatorView.write(buffer, bytes);
                String op1=str.substring(str.indexOf("a")+1, str.indexOf("b"));
               Log.d("output", op1);
                String op2=str.substring(str.indexOf("b")+1, str.indexOf("c"));
               Log.d("output", op2);
                String op3=str.substring(str.indexOf("c")+1, str.indexOf("d"));
              Log.d("output", op3);

                }
                else{

                mEmulatorView.write(buffer, bytes);
                }
                // Send the obtained bytes to the UI Activity
                //mHandler.obtainMessage(BlueTerm.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
        }
    }

我总是以这种形式获取数据: 12-12 12:43:54.681:D /数据传输(23778):a-695b-36c158d-666e-1326f144

12-12 12:43:54.681:D /数据传输(23778):a-684b-75c35d-659e-838f119

12-12 12:43:54.681:D /数据传输(23778):a-674b-353c238d-658e-556f148

例外:

>  E/AndroidRuntime(23778): FATAL EXCEPTION: Thread-2313 
> E/AndroidRuntime(23778): Process: es.pymasde.blueterm, PID: 23778 
> E/AndroidRuntime(23778):
> java.lang.StringIndexOutOfBoundsException:length=128; regionStart=29;
> regionLength=-26  E/AndroidRuntime(23778):    at
> java.lang.String.startEndAndLength(String.java:588) 
> E/AndroidRuntime(23778):  at
> java.lang.String.substring(String.java:1475) 

3 个答案:

答案 0 :(得分:1)

如果abcd的索引不符合预期的顺序,您将获得该异常。

例如,如果a的第一个索引在b的第一个索引之后,那么表达式str.substring(str.indexOf("a")+1, str.indexOf("b"))将抛出此异常,如Javadoc for the substring method中所述,承诺......

  

IndexOutOfBoundsException - 如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex ..

答案 1 :(得分:0)

试试这个

public static void main(String[] args) {
    String str="a-695b-36c158d-666e-1326f144";
    int aIndex=str.indexOf('a');
    int bIndex=str.indexOf('b');
    int cIndex=str.indexOf('c');
    int dIndex=str.indexOf('d');


    if(aIndex>-1 && bIndex>-1 && cIndex>-1&& dIndex>-1){
        System.out.println("op1 -->"+str.substring(aIndex+1,bIndex));
        System.out.println("op2 -->"+str.substring(bIndex+1,cIndex));
        System.out.println("op3 -->"+str.substring(cIndex+1,dIndex));
    }else{
        System.out.println("invalid format");
    }
}

注意: - 确保字母顺序(a,b,c ...)按升序排列。 当您尝试访问的子字符串的长度变为-ve,(endIndex-beginIndex)变为-ve时发生IOBE。

答案 2 :(得分:0)

您可以使用正则表达式来解析字符串: -

String str  = "a-695b-36c158d-666e-1326f144";
boolean v1=str.contains("a");                   
boolean v2=str.contains("b");
boolean v3=str.contains("c");
boolean v4=str.contains("d");
if(v1==true && v2==true && v3==true && v4==true){
  String aToB = str.replaceAll(".*a", "").replaceAll("b.*", "");
  System.out.println(aToB);
  String bToc = str.replaceAll(".*c", "").replaceAll("d.*", "");
  System.out.println(bToc);
  String cTod = str.replaceAll(".*d", "").replaceAll("e.*", "");
  System.out.println(cTod);

}