2015-11-09 22 views
4

如果标题不清楚,我很抱歉。字符串类中的子字符串方法达到索引它不应该

现在,串指数从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()返回我们一个整数,它比过去的指标是什么人了。

是故意制造的吗?这是否有目的?如果是这样,这是什么目的,它带来的好处是什么?

回答

6

更容易与substring工作的时候,你在想串索引这样

  H E L L O 
     0 1 2 3 4 5 
     ^  ^
     |   | 
     start  length 
    (min index) (max index) 

当您从ab你只有这些指标之间的字符字符串。

所以在"HELLO".substring(2,4)情况下,你会得到

L L 
2 3 4 

返回"LL"

现在在substring(5)的情况下,它的作用与substring(5,length)相同,这意味着在这种情况下它是substring(5,5)。因此,由于5索引在我们的模型中存在它被认为是正确的,并且因为55之间没有字符,所以我们得到空字符串作为结果。

只要索引存在于我们的模型中,类似的情况发生在substring(0,0)substring(1,1)等情况下。

  • 消极因素:

    StringIndexOutOfBoundsException只有当我们试图不属于我们的模型访问索引发生-1-2 ...

  • 或大于长度67更大,...
2

由于“索引越界异常中”这不会编译,

它编译。当您尝试执行代码时,您会得到一个运行时异常。

System.out.println("hello".substring(5)); 

最终,问题是,这怎么可能,我们可以达到这个指标,我们不应该?

阅读substring(...)方法的API。它解释了该方法的工作原理以及参数的含义。

在这种情况下,它返回一个空字符串。

+0

我们不会在“hello”.substring(5)上得到异常,但API解释我们得到“空”.substring(9)返回“”(一个空字符串)http://docs.oracle.com/ JavaSE的/ 7 /文档/ API /爪哇/郎/字符串。html#substring(int) – bakki

+0

是的,我也检查了文档。但我不明白,它说beginIndex是包容性的。他们是如何实施这种方法的? – Haggra

+1

'它说beginIndex是包容性的 - 当然它是包容性的。你如何得到索引为0的第一个字符?你会指定-1吗?这没有意义。将substring()方法与indexof()方法结合使用也很容易。您可以使用indexof()获取索引,使用substring()获取索引中的所有字符。 – camickr

1

在Java的String API (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int)

一个字符串 “长度()” 所指的子方法的方法将返回字符串中的字符数。

如果您从0-> 4计数“HELLO”,它仍然会达到5个字符(长度),这是您调用“Hello”.length()时返回的数字。如果你想访问一个字符串的最后一个字符,使用(Stringobj.length() - 1);如果你想访问字符串的最后一个字符,使用(Stringobj.length() - 1);通过使用.length()或.size()方法调用访问字符串或数组的最后一个元素在Java中是标准化的。

0

在这种情况下,charAt和substring的实现细节有助于了解。

this tutorial描述可以被描述为方法的charAt在于:

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

那就是为什么叫:

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

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 5 

因为最大的指数,因为你完全描述的那样,只有4

substring在Java中描述文档并解释您的具体情况here其中指出, “实施例” 部分:

“空虚” .substring(9)返回 “”(空字符串)

有关其他参考,这里是java's substring(int index)的源代码实现,你可以看到它使用java的substring(int beginInndex, int endIndex)方法。

相关问题