Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String类中的Substring方法达到了它所不是的索引';我不应该_Java_String_Indexing_Substring - Fatal编程技术网

Java String类中的Substring方法达到了它所不是的索引';我不应该

Java String类中的Substring方法达到了它所不是的索引';我不应该,java,string,indexing,substring,Java,String,Indexing,Substring,如果标题不清楚,我道歉 现在,在字符串中,索引从0开始。例如: Index 0 1 2 3 4 String H E L L O 在本例中,最后一个索引是4 如果我想做这样的事情: System.out.println("hello".charAt(5)); 它会抛出一个“索引越界异常”,这是应该的 但是,如果我尝试运行以下代码: System.out.println("hello".substring(5)); 它跑了!我编写了类似的代码,后来注

如果标题不清楚,我道歉

现在,在字符串中,索引从0开始。例如:

Index    0   1   2   3   4
String   H   E   L   L   O
在本例中,最后一个索引是4

如果我想做这样的事情:

System.out.println("hello".charAt(5));
它会抛出一个“索引越界异常”,这是应该的

但是,如果我尝试运行以下代码:

System.out.println("hello".substring(5));
它跑了!我编写了类似的代码,后来注意到了这一点,但无法理解

最后,问题是,我们怎么可能达到我们不应该达到的指标?它允许我们写:

stringObj.substring(stringObj.length());
而且它看起来不太安全,因为stringObj.length()返回的整数比最后一个索引多一个

它是故意制造的,并且有目的吗?如果是,目的是什么?它带来了什么好处

由于“索引越界异常”,它无法编译

它确实可以编译。当您尝试执行代码时,会出现运行时异常

System.out.println("hello".substring(5));
最后,问题是,我们怎么可能达到我们不应该达到的指标

阅读
子字符串(…)
方法的API。它解释了该方法的工作原理以及参数的含义


在本例中,它返回一个空字符串。

请参阅Java String API中的substring方法 ()

字符串“.length()”方法将返回字符串中的字符数

如果从0->4开始计算“HELLO”,它仍将达到5个字符(长度),这是调用“HELLO”.length()时返回的数字


如果要访问字符串的最后一个字符,请使用(Stringobj.length()-1);通过使用.length()或.size()方法调用访问字符串或数组的最后一个元素在Java中是标准化的。

在本例中,了解方法charAt和substring的实现细节很有帮助

中所述的特征可以描述为方法:

返回位于字符串指定索引处的字符。字符串索引从零开始

这就是为什么打电话:

System.out.println("hello".charAt(5));
给予

Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 5
因为正如您完美描述的,最大索引只有4。

substring
在java文档中进行了描述,并在“示例”部分解释了您的确切情况,其中说明:

“空”。子字符串(9)返回“”(空字符串)


作为补充参考,这里是实现的源代码,您可以看到它使用了java的
子字符串(int BeginInIndex,int endIndex)
方法。

当您想到这样的索引时,使用
子字符串
就更容易了(索引之间的类字母是

返回
“LL”

现在在
子字符串(5)
的情况下,它的作用与
子字符串(5,长度)
相同,这意味着在这种情况下它是
子字符串(5,5)
。因此,由于
5
索引作为可接受的值存在于我们的“模型”中,并且由于
5
5
之间没有字符,因此我们得到的是空字符串

如果子字符串(0,0)
子字符串(1,1)
等等,只要我们的模型可以接受索引,就会出现类似的情况

StringIndexOutOfBoundsException
仅当我们尝试访问不可接受的索引时才会发生,这意味着:

  • 消极的:
    -1
    -2
  • 大于
    长度
    。这里:
    6
    7

我们不会在“hello”上得到异常。子字符串(5)但API解释我们得到“空”。子字符串(9)返回“”(空字符串)是的,我也检查了文档。但我不明白它说beginIndex是包容性的。他们是如何实现这种方法的?
它说beginIndex是包容性的
——当然是包容性的。如何获得索引为0的第一个字符?你能指定-1吗?那没有道理。将substring()方法与indexof()方法结合使用也很容易。您使用indexof()获取索引,使用substring()获取索引中的所有字符。我知道它应该是包含的,但我仍然不明白为什么在尝试str.substring(str.length())时它不抛出异常<代码>我仍然不明白为什么它不抛出异常API特别声明它将返回一个空字符串。API特别声明,如果索引大于长度,它将抛出异常。因此,这种行为有很好的记录。就我个人而言,我想不出为什么要使用substring返回空字符串。
         H E L L O
        0 1 2 3 4 5    <- acceptable range of indexes for "HELLO"
        ^         ^
        |         |
      start      end = length
   (min index) (max index)
 L L 
2 3 4