【问题标题】:Why is substring() function in returning a value when it should be returning an overflow message为什么 substring() 函数在应该返回溢出消息时返回值
【发布时间】:2013-12-31 17:54:48
【问题描述】:

我正在尝试解决如下问题:-

给定一个字符串,返回一个“向左旋转 2”的版本,其中前 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 字符结尾,所以我认为第二个函数有错误。

【问题讨论】:

  • 来自docs.oracle.com/javase/6/docs/api/java/lang/…: "抛出:IndexOutOfBoundsException - 如果 beginIndex 为负数或大于此 String 对象的长度。"
  • 您尝试传递一个字符还是一个空字符串?
  • @kusur 这个链接解释了一切stackoverflow.com/questions/3233379/…
  • 当您在"hi" 上执行str.substring(2) 时,它会获取从“i”之后的位置开始并在字符串末尾结束的子字符串,也就是空格。

标签: java string


【解决方案1】:

这是因为您的 Substring 逻辑仅在文本长度大于 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 或
  • c。 beginIndex 大于 endIndex。

【讨论】:

  • 我说的是第二个函数。
  • @kusur 我已经包含了子字符串的源代码,它应该可以准确地告诉您何时引发 StringIndexOutOfBoundsException
  • 这些条件是否也适用于ArrayIndexOutofBoundsException
【解决方案2】:

第二个功能的原因

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

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

当你传递一个由两个字符组成的字符串时,它起作用的原因是你传递的索引被允许等于字符串的长度(在这种情况下,2)。当您将一个等于字符串长度的索引传递给采用一个参数的substring 时,您会得到一个空字符串。当您将一个等于字符串长度的索引传递给两个参数substring 时,它会将字符串带到最后一个字符(包括最后一个字符)。

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多