字符串超出范围异常

时间:2014-06-04 22:31:42

标签: java

给定一个字符串,如果字符串以“hi”开头则返回true,否则返回false。示例输出:

startHi("hi there") = true
startHi("hi") =true
startHi("hello hi") =false

实际代码:

   public boolean startHi(String str) {
  String firstTwo = str.substring(0,2);

if (str.length() < 2) return false;

  if (firstTwo.equals("hi")) {
  return true;
  } else {


  return false;
  }
}

除了少于2个字符的字符串外,一切都在运行。它不断给出错误:

异常:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:2(行号:2)

5 个答案:

答案 0 :(得分:2)

您需要移动substring电话后面的长度检查!

public boolean startHi(String str) {

  if (str.length() < 2) return false;

  String firstTwo = str.substring(0,2);
  if (firstTwo.equals("hi")) {
    return true;
  } else {
    return false;
  }
}

substring的调用失败,因为它 - 如异常告诉我们 - 需要一个长度为2(或更长)的字符串。

<强> BUT

由于Java字符串具有startsWith方法,因此整个方法可能要简单得多:

public boolean startHi(String str) {
  return str.startsWith("hi");
}

答案 1 :(得分:1)

尝试反转方法的前两个字符串。

public boolean startHi(String str) {
    if (str.length() < 2) return false;

    String firstTwo = str.substring(0,2);
    ....
}

否则,如果您将substring行留在首位,则您已经假设该字符串长度至少为2个字符。如果不是这样,它将导致异常。将长度验证置于首位可确保字符串的最小长度。

Beyind,您可以尝试使用String方法startsWith

答案 2 :(得分:0)

试试这个:

public boolean startHi(String str) {
  if (str.length() < 2) return false;
    else{
        String firstTwo = str.substring(0,2);
          if (firstTwo.equals("hi")) {
            return true;
           }
              else {
                 return false;
              }
          }
   }

答案 3 :(得分:0)

如评论中所述,请考虑使用String类的内置startsWith方法。它的实现可以通过sun jdk源代码获得。

/**
     * Tests if the substring of this string beginning at the
     * specified index starts with the specified prefix.
     *
     * @param   prefix    the prefix.
     * @param   toffset   where to begin looking in this string.
     * @return  {@code true} if the character sequence represented by the
     *          argument is a prefix of the substring of this object starting
     *          at index {@code toffset}; {@code false} otherwise.
     *          The result is {@code false} if {@code toffset} is
     *          negative or greater than the length of this
     *          {@code String} object; otherwise the result is the same
     *          as the result of the expression
     *          <pre>
     *          this.substring(toffset).startsWith(prefix)
     *          </pre>
     */
    public boolean startsWith(String prefix, int toffset) {
        char ta[] = value;
        int to = toffset;
        char pa[] = prefix.value;
        int po = 0;
        int pc = prefix.value.length;
        // Note: toffset might be near -1>>>1.
        if ((toffset < 0) || (toffset > value.length - pc)) {
            return false;
        }
        while (--pc >= 0) {
            if (ta[to++] != pa[po++]) {
                return false;
            }
        }
        return true;
    }



public boolean startsWith(String prefix) {
        return startsWith(prefix, 0);
    }

答案 4 :(得分:0)

最简单的方法是使用字符串的startsWith方法,但是如果它是null,则需要先检查它。

public boolean startsWithHi(String str) {
  if (str == null) {
    return false;
  }
  return str.startsWith("hi");
}

如果字符串以&#34; HI&#34;开头。也需要返回true,你应该做str.toLowerCase()。startsWith(&#34; hi&#34;);