3 votes

java : exception 'string index out of range : -1' en utilisant indexOf()

Problème étrange. Je lance cette procédure (très élémentaire) pour trouver un nom d'utilisateur et un mot de passe dans un fichier, et le programme devrait comparer le mot de passe saisi au mot de passe enregistré. Cependant, à chaque fois, j'obtiens un étrange String index out of range: -1 exception. J'ai déjà été confronté à un problème similaire, mais cette fois-ci, l'exception est la suivante indexOf('.') l'appel retourne -1 qu'il n'aime pas. Pourquoi est-ce que indexOf() en retournant sur -1 si cela provoque une erreur ? Voici la source :

public String loginToClient() throws FileNotFoundException, IOException {
        //decryptUsers();
        int tries;
        tries = 5;
        while (tries > 0) {
            System.out.println("LOGIN");
            String usnm = c.readLine("Username: ");
            char [] passwd = c.readPassword("Password: ");
            users = new FileInputStream("users.fra");
            DataInputStream dis = new DataInputStream(users);
            BufferedReader br = new BufferedReader(new InputStreamReader(dis));
            String logindat = br.readLine();
            System.out.println(logindat);
            if (logindat.contains(usnm) == null) {
                System.err.println("Username not recognised, please try another or create user.");
                usnm = "INV";
                return usnm;
            }
            else {
                int startUsnm = logindat.indexOf(usnm);
                System.out.println("startUsnm: " + startUsnm);
                String logdat = logindat.substring(startUsnm, logindat.indexOf("."));
                System.out.println("logdat: " + logdat);
                int endUsnm = logdat.indexOf(':'); 
                System.out.println("endUsnm: " + endUsnm);
                int usnmend = endUsnm - 1;
                System.out.println("usnmend: " + usnmend);
                int startPass = endUsnm + 1;
                System.out.println("startPass: " + startPass);
                int endPass = logdat.indexOf('.');
                System.out.println("endPass: " + endPass);
                String Usnm = logdat.substring(0, usnmend);
                System.out.println("Usnm: " + Usnm);
                int passend = endPass - 1;
                System.out.println("passend: " + passend);
                String Pass = logdat.substring(startPass, passend);
                System.out.println("Pass: " + Pass);
                char [] Passwd = Pass.toCharArray();
                if (usnm.equals(Usnm)) {
                    if (Arrays.equals(passwd,Passwd)) {
                        System.out.println ("Logged in. Welcome, " + usnm + ".");
                        String data = "LOGIN: " + usnm;
                        printLog(data);
                        //encryptUsers();
                        return usnm;
                    }
                    else {
                        System.out.println ("Incorrect password, please try again.");
                        String data = "PASWFAIL: " + usnm;
                        printLog(data);
                        tries -= 1;
                    }
                }
                else {
                    System.out.println ("Username not recognised.");
                    printLog("USNAMFAIL");
                    usnm = "INV";
                    return usnm;
                    //encrytUsers();
                }
            }
        }
        //encryptUsers();
        System.exit(2);
        return usnm;
    }

Et voici quelques entrées/sorties :

Startup initiated.
Logfile exists.
Users file exists.
New user? n
ELSE
LOGIN
Username: rik
Password: 
rik:55.
startUsnm: 0
endUsnm: 3
startPass: 4
endPass: -1
Usnm: rik
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5
    at java.lang.String.substring(String.java:1949)
    at client0_0_2.loginToClient(client0_0_2.java:103)
    at client0_0_2.general(client0_0_2.java:209)
    at client0_0_2.<init>(client0_0_2.java:221)
    at client0_0_2.main(client0_0_2.java:228)

EDIT : SOLUTION TROUVÉE !

Pour une raison quelconque, indexOf() ne veut pas trouver un '.'- lorsqu'il est remplacé par un tiret ('-'), mais il fonctionne parfaitement, apparemment !

2voto

templatetypedef Points 129554

Je pense que l'erreur se trouve dans cette ligne :

String Pass = logdat.substring(startPass, passend);

Pour une raison ou une autre (vous devrez déterminer pourquoi), vous calculez passend en recherchant . dans la chaîne. Si . n'est pas présent, indexOf renvoie -1 comme sentinelle. Ce n'est pas la ligne qui cause l'exception, cependant. Je pense que c'est la ligne ci-dessus, car si vous essayez de calculer une sous-chaîne se terminant par passend quand passend est -1, vous obtiendrez l'erreur ci-dessus.

Essayez de déterminer pourquoi votre chaîne de caractères ne contient pas un . en elle.

J'espère que cela vous aidera !

1voto

wattostudios Points 8466

Lorsque indexOf() renvoie à -1 cela signifie que la valeur n'a pas été trouvée dans la chaîne. Donc, dans ce cas, vous recherchez dans une chaîne de caractères la valeur suivante '.' qui n'existe pas dans la chaîne.

Je vous recommande siempre vérifier les valeurs de indexOf() après l'appel, et traiter le -1 correctement. Dans la plupart des cas, il suffit de le régler sur l'une des deux valeurs suivantes 0 o string.length() selon l'utilisation que vous en ferez plus tard dans votre code.

Quoi qu'il en soit, si vous attendez une '.' et qu'il n'y en a pas, vous devrez déboguer votre code pour trouver quelle est la valeur, et où se trouve l'objet de l'enregistrement. '.' est manquant.

0voto

Himanshu Mohta Points 546

indexOf() renvoie à -1 si la chaîne spécifiée est introuvable.

Le problème se situe au niveau de la ligne :

String Pass = logdat.substring(startPass, passend);

en raison de l'indice négatif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X