这里我包含了完整的代码,该错误来自我的规则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会导致用户输入无效)。我只是想了解超出范围的异常源于我的代码。 谢谢。
答案 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的所有循环。
希望这对您有所帮助。