Java - 在预期时没有得到“StringIndexOutOfBoundsException”

时间:2014-09-12 22:07:19

标签: java indexoutofboundsexception

我有以下代码

public class test{
    public static void main(String[] args){
        String one = "x";
        if(one.charAt(one.indexOf('x')+1)== 'p'){
            System.out.println("test");
        }
    }
}

这会导致以下错误:

线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:1     at java.lang.String.charAt(String.java:658)     在test.main(test.java:4)

我希望这种情况发生,我的理解是它正在发生,因为String只有1个索引(0)因此无法在索引1处找到该字符

one.charAt(one.indexOf('x')+1)== 'p'

如果我的理解是正确的,我无法理解为什么这个其他程序没有同样的问题

class XClass{
   boolean doubleX(String str){
      boolean is = false;
      int indexes = str.length()-1;
      if(str.indexOf('x')== indexes){
         is = false;
      }else if(str.charAt(str.indexOf('x')+1)=='x'){//same code as the program above
         is = true;
      }
      return is;
   }
}

public class ImplementXClass{
   public static void main(String[] args){
      XClass Xmen = new XClass();
      boolean result = Xmen.doubleX("x");
      System.out.println(result);
   }
}

即使方法参数是带有一个索引(“x”)的字符串,该程序也能成功编译。

  • 如果没有索引1,程序如何运行此行str.charAt(str.indexOf('x')+ 1)=='x'。
  • 它不应该无法编译成第一个程序吗?
  • 我错过了什么?

3 个答案:

答案 0 :(得分:1)

因为您的一个字符String传递了第一个if条件,

int indexes = str.length()-1; // length is 1, 1-1 is 0.
if(str.indexOf('x')== indexes){ // str.indexOf('x') == 0
  is = false; // <-- hits this.

您的else if未被评估。

答案 1 :(得分:1)

str"x"时,else if甚至无法运行。

if条件

if(str.indexOf('x') == indexes)

true,因为str.indexOf('x')返回0,而indexes也是0 - str.length() - 1

因此,is设置为false,并且永远不会评估else if条件。因此,不会发生IndexOutOfBoundsException

答案 2 :(得分:1)

  //str = "x"
  int indexes = str.length()-1; //indexes = 0;
  if(str.indexOf('x')== indexes){  //evals to true, because the index of x is 0 in string "x"
     is = false;
  } else { 
     //... never executes because above evaluated to true