【问题标题】:In Java, I have a String named string "A"( size 1). Why does string.substring(1) give no exceptions在 Java 中,我有一个名为字符串“A”(大小 1)的字符串。为什么 string.substring(1) 没有例外
【发布时间】:2015-05-08 05:11:22
【问题描述】:

在 java 中,我有一个名为 string 的字符串,其值为“A”。
String string = "A";

它的大小是 1,我们知道字符串中的字符是 0 索引的。它们表示为一个 Char 数组。 那么,string.substring(1); 为什么不给我一个例外呢?

【问题讨论】:

  • 魔鬼在细节中。 “抛出:IndexOutOfBoundsException - 如果 beginIndex 为负数或大于此 String 对象的 长度。带有单个字符的String 的大小为1...
  • @MadProgrammer 这应该是答案。

标签: java string exception substring


【解决方案1】:

如果您查看substring(int beginIndex) 的代码:

 public String substring(int beginIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        int subLen = value.length - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
    }

没有条件指定如果length为1,index为1,则应该抛出异常。事实上,返回一个新的 empty 字符串。

System.out.println("A".substring(1).equals("")); 返回true,因为方法的最后一行

【讨论】:

  • 除了,你不应该看代码,你可以看JavaDocs,它说得很好;)
  • @MadProgrammer - 对。但我发现在代码中找到 answers 更容易。 ctrl+shift+R 就是这样:P
【解决方案2】:

基于JavaDocs for String#subString(int)

抛出:
IndexOutOfBoundsException - 如果 beginIndex 为负数或大于此 String 对象的长度”。

具有单个字符的字符串的大小为1,因此1 == length

【讨论】:

  • 这比其他答案好。 “因为它是这样指定的”比“因为它是这样编码的”更好。
【解决方案3】:

你可以在substring的代码中看到

    int subLen = value.length - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }

它只会抛出exception 如果然后弹簧的长度低于即开始索引。

在你的情况下,开始索引等于长度,这就是你没有得到异常的原因。

【讨论】:

  • 如果我错了,请纠正我。索引为 0,长度为 1,对吧?它们不相等。
  • @A1ternat1ve beginIndex 为 1。substring(1) 中的参数。
【解决方案4】:

其他人引用了该规则,但我想指出其中的含义。如果你说s.substring(n),那么n 可以是0 到s.length() 之间的任意值,包括0 到s.length()。这意味着如果s 的长度为len,则有len+1(而不是len)可能的方式来调用s.substring 与一个参数。这是有道理的,因为例如,如果您有字符串"abcde",并且您使用substring(n) 来获取字符串的后缀,则有六个可能的后缀:"abcde""bcde", "cde", "de", "e", "".

这在实践中很有帮助,因为您可以编写类似的代码

while (<something>) {
    if (s.beginsWith(prefix)) {
    ... do some other stuff ...
    s = s.substring(prefix.length());
        // This sets "s" to the remainder of the string, after the prefix.
        // It works even if there is no more text in the string, i.e. 
        // prefix.length() == s.length(), so that the remaining text is "".
}

根据我的经验,以这种方式工作的能力非常有益。它避免了强迫你编写特殊的逻辑来处理这种边界情况,因为边界情况的处理与非边界情况是一致的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2014-10-23
    • 2012-04-26
    • 2013-07-11
    • 2021-12-31
    • 2021-12-16
    相关资源
    最近更新 更多