ArrayIndexOutOfBoundsException嵌套循环if语句

时间:2018-07-27 05:22:36

标签: java

这里我包含了完整的代码,该错误来自我的规则3方法的最后一部分,我尝试了其他在线资源,但是如果有人可以引导我寻求解决方案,我将无法理解我如何得到此错误。非常感谢,下面是我的代码:

import java.util.Scanner;

public class Assignment5E3{
  public static void main(String[] args){
  Scanner reader = new Scanner(System.in);
  System.out.println("Please enter a new password: ");
  String password = reader.next();
  String firstRule = ruleOne(password);
  String secondRule = ruleTwo(password);
  String thirdRule = ruleThree(password);
  }
  public static String ruleOne(String password){
    if( password.length() < 5 || password.length() > 12 ){
      System.out.println("Password must be between 5 and 12 characters!");
    }else{
      System.out.println(password);
    }
    return password;
  }
  public static String ruleTwo(String password){
    int j = 0;
    int k = 0;
    for(int i=0; i<password.length(); i++){
      char ch = password.charAt(i);
      if(Character.isLetterOrDigit(ch)){
        j++;
      }else if(!Character.isLetterOrDigit(ch)){
        k++;
      }
    }
    if(k > 0){
      System.out.println("Password may only contain letters and numbers");
    }

    return password;
  }

  public static String ruleThree(String password){
    char[] input = password.toCharArray();
    char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
    char[] numbers = "0123456789".toCharArray();
    for(int i = 0; i<input.length-1; i++){
      for(int j = 0; j<numbers.length-1; j++){
        if((input[i] == numbers[j+1]) && (input[i+1] == numbers[j+2]) && (input[i+2] == numbers[j+3]) && (input[i+3] == numbers[j+4]) && (input[i+4] == numbers[j+5])){
          System.out.println("Password cannot have 5 numbers in sequence!");
       }
      }
      for(int k = 0; k<letters.length-1; k++){
        if((input[i] == letters[k+1]) && (input[i+1] == letters[k+2]) && (input[i+2] == letters[k+3]) && (input[i+3] == letters[k+4]) && (input[i+4] == letters[k+5])){
          System.out.println("Password cannot have 5 letters in sequence!");
        }
}
}
    return password;
}
}

我从代码中获得了想要的输出,但是随着输出,我收到了出站异常错误。该部分代码的目的是确保顺序中没有5个字母或数字(例如,密码中连续12345个和abcde会导致用户输入无效)。我只是想了解超出范围的异常源于我的代码。 谢谢。

3 个答案:

答案 0 :(得分:1)

看看你的循环。循环播放直到length-1表示倒数第二个元素。但是,您想向前看5个元素,如果您位于倒数第四个元素,那么就没有第五个元素。 将其更改为length-5,看看是否超出限制。

答案 1 :(得分:1)

主要问题来自for方法中的ruleThree循环。

例如,当您使用时:

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

如果密码长度为8,则i将从0到6。 然后,您测试一个字符是否为具有以下条件的数字:

(input[i+4] == numbers[j+5])

如果i = 6,则i + 4 = 10> password.length给您ArrayIndexOutOfBounds。

2种可能的方法

更改循环最终索引:

for(int i = 0; i<input.length-5; i++)

因为您已经检查了密码长度> 5个字符。

或者您可以使用Java regex:https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

例如:

Pattern pattern = Pattern.compile("\\d{5}");
//Get your password from your user input in String password;
Matcher matcher = pattern.matcher(password)
if(matcher.find()){
    System.out.println("Password cannot have 5 numbers in sequence!");
}
//You can do the same with letters

Java正则表达式非常适合解析和检查用户输入。

编辑: 您可以在Java正则表达式生成器中测试模式,例如:https://regexr.com/

我给您的正则表达式将匹配以下输入: pass12345 pa12345ss

,并且不匹配 pa1234ss pass1234

答案 2 :(得分:0)

请注意,检查数字和字母的外循环和内循环遍历到length-1。 例如,如果您有密码

acd123

其长度为 6 ,您的内部循环遍历5次迭代。在循环内部,当迭代次数为0时,它将尝试访问0(a),1(c),2(d),3(1),4(2)索引以比较字母/数字,这是有效的。在第二次迭代中,它尝试访问1(c),2(d),3(1),4(2),5(3),在第三次迭代中,它尝试访问2(d),3(1) ),4(2),5(3),6(此索引上没有字符),因为它的长度为6。所以无效。

解决此问题的一种简单方法是遍历长度为5的所有循环。

希望这对您有所帮助。