【问题标题】:Java - StringIndexOutOfBoundsException [duplicate]Java - StringIndexOutOfBoundsException [重复]
【发布时间】:2013-10-29 22:27:39
【问题描述】:

首先,这是我的代码有问题的部分;这些是非常基础的类

public Passenger(String Name, String adress, String number, String password){
    count++;
    accId+=count;

    this.Name=Name;

    this.adress=adress;
    this.number=number;

    if(checkPw(password)==true){
        this.password=password;
    }

}

private boolean checkPw(String password){
    int length;
    length = password.length();

    if(length != 6){
        return false;
    }
    else if(password.charAt(0)==0){
        return false;
    }
    else {
        for (int i = 0; i < password.length();i++){
            if((password.charAt(i))==(password.charAt(i+1))){
                return false;
            }
        }
    }
    return true;        
}

测试类:

public static void main(String[] args){
    Passenger gokhan=new Passenger("Gokhan","Istanbul","xxx","254651");

    System.out.println(gokhan.password);
}

所以,我认为问题出在乘客类上。这是我第一次在课堂上上课(我的意思是 if(checkPw(password)==true) 部分)。在测试类中,看起来很清晰,没想到会出现这个错误。如何避免此消息?

完全错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
    at java.lang.String.charAt(String.java:658)
    at project1.Passenger.checkPw(Passenger.java:45)
    at project1.Passenger.<init>(Passenger.java:27)
    at project1.testClass.main(testClass.java:11)

Java 结果:1

【问题讨论】:

    标签: java string class oop


    【解决方案1】:

    问题就在这里:

    for (int i = 0; i < password.length();i++){
        if((password.charAt(i))==(password.charAt(i+1))){
            return false;
        }
     }
    

    当您处于最后一次迭代中时,您正尝试访问 string 中不存在的 i+1 位置的 char

        text
           ^
           |
    when i = 3 charAt(i) will return t and charAt(i+1) will throw the exception
    

    【讨论】:

      【解决方案2】:

      这行似乎是问题所在:

      if((password.charAt(i))==(password.charAt(i+1))){
      

      for 循环的最后一次迭代中,i5i+1,或6,超出了字符串的末尾,因为索引范围从0 到@987654328 @。这里的解决方案是在倒数第二个字符而不是最后一个字符之后停止for 循环迭代。改变

      for (int i = 0; i < password.length();i++){
      

      for (int i = 0; i < password.length() - 1; i++){
      

      所以ifor 循环中的最大值是4,所以i+15 不会超出字符串的末尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        相关资源
        最近更新 更多