使用Java中的字符串根据特定要求接受密码

时间:2012-10-01 01:59:20

标签: java string

该程序假设接受输入字符串,即密码。然后程序检查以确保密码长度至少为8个字符,包含至少2个数字,并且只包含字母和数字。我似乎无法获得至少2位数的正确方法,尽管我已经看到这种方法应该有效。

这是我得到的错误 线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:10     at java.lang.String.charAt(String.java:658)     在Password.main(Password.java:35)

import java.util.*;


public class Password{
    public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    String s;
    int numbers = 0;

    System.out.println("Enter a password (Must contain only letters and numbers, ");
    System.out.print("minimum of 8 characters with atleast two numbers): ");    
    s = input.nextLine();

    while(1==1){
    if (s.length() < 8){
        System.out.println("Password is too short");
        System.out.println("Enter correctly formatted password");
        s = input.nextLine();
        continue;
        }

    if (s.matches("^[a-zA-Z0-9_]+$")){  
    }
    else{
        System.out.println("Password may only contain Letters and Digits");
        System.out.println("Enter correctly formatted password");
        s = input.nextLine();
        continue;
        }



    int i;
    for (i = 0; i <= s.length(); i++){
        if (Character.isDigit(s.charAt(i))){
            numbers++;
            }
            }

    if (numbers < 2){
        System.out.println("Password must contain atleast 2 digits");
        System.out.println("Enter correctly formatted password");
        s = input.nextLine();
        continue;
        }
        break;
        }


    while (0==0){   
    System.out.println("Reenter Password to see if it matches");
        String a = input.nextLine();

    if (s.equals(a)){
        System.out.println("Password matches!");
        break;
        }
    else{
        System.out.println("Password does not match");
        continue;
    }
    }
    }
    }

3 个答案:

答案 0 :(得分:5)

在for循环中,您不应允许i等于s.length()

for (i = 0; i <= s.length(); i++)

当您尝试访问s[s.length()]时会导致ArrayIndexOutOfBoundsException。

答案 1 :(得分:0)

由于使用从0到长度的索引,此语句正在获取异常。而不是使用0到&lt;长度。

 for (i = 0; i <= s.length(); i++){
    if (Character.isDigit(s.charAt(i))){
        numbers++;
    }
 }

答案 2 :(得分:0)

替换为(i = 0; i&lt; = s.length(); i ++){by for(i = 0; i&lt; s.length(); i ++){

示例:假设字符串s =“abc”。 s.length()= 3. s.charAt(0)=“a”,s.charAt(1)=“b”,s.charAt(2)=“c”。 s.charAt(3)不存在并抛出异常。