java.lang.stringoutofboundsexception length = 40,startRegion = 21,regionLength = -15

时间:2017-06-13 16:28:18

标签: java android

我是开发人员的新手,现在在.substring

中获得了一个超出界限的例外

length = 40,startRegion = 21,regionLength = -15

该字符串为40个字符,并由条形码阅读器扫描。条形码是(01)90000055097706(3103)018130(10)24022402(30)00。

扫描时显示为0190000055097706310301813010240224023000

请帮忙。

编辑:寻找字符串的018130部分。感谢您指出startIndex,endIndex。这就是我所缺少的,认为语法是startIndex,长度。

再次感谢。

  String scannedAmount = scanAmount.getText().toString();
    if(scannedAmount.length() > 10)
    {
        scannedAmount = scannedAmount.substring(21, 6); // removes only the weight value in the string
        barcodeAmount = parseDouble(scannedAmount);
        barcodeAmount = barcodeAmount * conversion;//changes the weight from kg to lb
    } else if(scannedAmount.length()<=10) {
        barcodeAmount = parseDouble(scannedAmount);
    }

3 个答案:

答案 0 :(得分:0)

scansAmount = scansAmount.substring(21,6);

String substring end index错误。下面是jdk代码。你的结束索引应该大于开始索引。

    <pre>int subLen = endIndex - beginIndex; 
          if (subLen < 0) {
             throw new StringIndexOutOfBoundsException(subLen); 
           }
      </pre>

答案 1 :(得分:0)

如oracle文档网站上所列,这是子字符串的工作原理:

  

public String substring(int beginIndex,                  int endIndex)

     

返回一个新字符串,该字符串是此字符串的子字符串。子串   从指定的beginIndex开始并延伸到at处的字符   index endIndex - 1.因此子字符串的长度是   endIndex的-的beginIndex。

     

示例:

 "hamburger".substring(4, 8) returns "urge"
 "smiles".substring(1, 5) returns "mile"

您需要将第一个索引作为第一个参数传递,将第二个索引作为第二个参数传递。

抛出stringOutOfBoundsException是因为你试图在-15索引处索引字符串(6 - 21)。

将您的代码更改为:

scannedAmount = scannedAmount.substring(6, 21);

你不会再从这一行得到例外。

至于代码的功能,我不会说话,因为你没有给出应该发生的事情的任何背景。

答案 2 :(得分:0)

我相信您更熟悉的语法是C#,即substring(startIndex, lengthOfSubstring),但在java中,正确的语法是

substring(startIndex, endIndex)

返回的String是字符串的一部分,从startIndex开始直到endIndex(不包括在内)。因此,如果您希望从索引21开始的字符串中包含六个字符,那么

scannedAmount = scannedAmount.substring(21, 27);