为什么substring()函数在返回溢出消息时返回一个值

时间:2013-12-13 03:13:54

标签: java string

我正在尝试解决这样的问题: -

给定一个字符串,返回一个“旋转左2”版本,其中前两个字符移动到结尾。字符串长度至少为2。

left2("Hello") → "lloHe"
left2("java") → "vaja"
left2("Hi") → "Hi"

我为此写了两个函数: -

    public String left2(String str)
    {
         String str1 = str;
          if(str.length()>2)
           str1 = str.substring(2)+str.substring(0,2);
         return str1;
    }

    public String left2(String str)
    {
         return str.substring(2)+str.substring(0,2);
    }

这两个功能都是正确的。我想知道如果substring()函数的第一个参数是索引,那么我在第二个函数中没有得到overflow错误吗?我问这个是因为Java没有以NULL字符结尾所以我认为第二个函数中存在错误。

2 个答案:

答案 0 :(得分:2)

这是因为只有当文本长度大于2时,您的子串逻辑才有效。请参见此处:

    if(str.length()>2)
       str1 = str.substring(2)+str.substring(0,2);

这是java中substring方法的源代码:

public String substring(int beginIndex, int endIndex) {
     if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
     }
     if (endIndex > count) {
          throw new StringIndexOutOfBoundsException(endIndex);
     }
     if (beginIndex > endIndex) {
           throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
     }
     return ((beginIndex == 0) && (endIndex == count)) ? this :
           new String(offset + beginIndex, endIndex - beginIndex, value);
}

根据经验,文档可能存在,但代码却没有。只有在

时才会抛出StringIndexOutOfBoundsException
  • 一个。 beginIndex小于0(即为负)或
  • 湾endIndex大于count或
  • ℃。 beginIndex大于endIndex。

答案 1 :(得分:1)

第二个功能的原因

return str.substring(2)+str.substring(0,2);

的作用是你从未尝试传递一个短于两个字符的字符串。如果您这样做,您将收到异常(demo)。

当您传递两个字符的字符串时,这是有效的原因是您传递的索引允许等于字符串的长度(在本例中为2)。当您将一个等于字符串长度的索引传递给带有一个参数的substring时,您会得到一个空字符串。当您将一个等于字符串长度的索引传递给双参数substring时,它会将字符串包含到最后一个字符中。