Ошибка входа в систему JAVA - PullRequest
0 голосов
/ 05 июня 2018

при попытке добавить пользователя в мой список входа в систему, который представляет собой текстовый файл, я всегда получаю сообщение об ошибке, которое абсолютно не понимаю.

Мой код в основном выполняет две вещи.Сначала он сравнивает имя пользователя и пароль, заданные пользователем, чтобы увидеть, присутствует ли он уже в списке входа (текстовый файл).Во-вторых, он позволил пользователю зарегистрироваться, другими словами, добавил в список входа в систему.

Сейчас я пытаюсь добавить систему оценок, где для каждого пользователя есть количество побед и поражений для игр, которыеЯ создам позже.

Вот мой код:

Main

package boitedejeux;

import java.io.IOException;
import java.util.Scanner;

public class BoiteDeJeux {

    public static void main(String[] args) throws IOException, UsernameException, PasswordException {
        Scanner input = new Scanner(System.in);
        String username;
        String password;
        System.out.println("Enter your username:");
        username = input.nextLine();
        System.out.println("Enter your password:");
        password = input.nextLine();
        UserList test = new UserList();
        test.inscription(username, password);
    }

}

Пользователь

package boitedejeux;

import java.util.Objects;

public class User {

    private String username;
    private String password;
    private Score ps;

    public User(String username, String password, int hangmanVictory, int hangmanDefeat) throws UsernameException, PasswordException {
        // On vérifie que le nom de l'utilisateur ne soit pas vide.
        if (username.length() == 0 || username.length() == 1) {
            throw new UsernameException("The username must contain at least two elements.");
        }
        // On vérifie que le nom de l'utilisateur ne soit pas vide.
        if (username.length() == 0 || username.length() == 1) {
            throw new UsernameException("The username must contain at least two elements.");
        }
        // On vérifie que le nom de l'utilisateur doit commencer par une majuscule.
        if (username.charAt(0) > 'Z' || username.charAt(0) < 'A') {
            throw new UsernameException("The username must begin with an uppercase.");
        }
        // On vérifie que le nom de l'utilisateur ne doit contenir que des minuscules et des chiffres.
        for (int i = 1; i < username.length(); i++) {
            if ((username.charAt(i) > 'z' || username.charAt(i) < 'a') && (username.charAt(i) > '9' || username.charAt(i) < '0')) {
                throw new UsernameException("The username must contain only lowercase and numbers after the first element.");
            }
        }
        // On vérifie que le vérifie que le mot de passe de l'utilisateur ne soit pas vide.
        if (password.length() == 0 || password.length() == 1) {
            throw new PasswordException("The password contain at least two elements.");
        }
        // On vérifie que le mot de passe de l'utilisateur doit commencer par une majuscule.
        if (password.charAt(0) > 'Z' || password.charAt(0) < 'A') {
            throw new PasswordException("The password must begin with an uppercase.");
        }
        // On vérifie que le mot de passe de l'utilisateur ne doit contenir que des minuscules et des chiffres.
        for (int i = 1; i < password.length(); i++) {
            if ((password.charAt(i) > 'z' || password.charAt(i) < 'a') && (password.charAt(i) > '9' || password.charAt(i) < '0')) {
                throw new PasswordException("The password must contain only lowercase and numbers after the first element.");
            }
        }
        this.password = password;
        this.username = username;
        this.ps = new Score(hangmanVictory, hangmanDefeat);
    }

    //Renvoie le pseudo de l'utilisateur.
    public String getUsername() {
        return username;
    }

    //Renvoie le mot de passe de l'utilisateur.
    public String getPassword() {
        return password;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof User) {
            return ((User) o).username.equals(username);
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 97 * hash + Objects.hashCode(this.username);
        return hash;
    }
}

UserList

package boitedejeux;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class UserList {

    private HashSet<User> loginList;

    //Initialise une liste vide et la remplie à partir d'un fichier texte.
    public UserList() throws UsernameException, PasswordException {
        Scanner scan;
        loginList = new HashSet();
        try {
            scan = new Scanner(new File("src/boitedejeux/Logins.txt"));
            String ligne = scan.nextLine();
            while (scan.hasNext()) {
                ligne = scan.nextLine();
                String[] res = ligne.split(", ");
                loginList.add(new User(res[0], (res[1]), Integer.parseInt(res[2]), Integer.parseInt(res[3])));
            }
        } catch (FileNotFoundException e) {
            System.out.println("Error");
        }
    }

    // Vérifie que la loginList soit bien initialisé.
    //Puis l'a parcours en vérifiant que le nom d'uttilisateur et le mot de passe correspondent à un présent dans la liste. Si présent renvoie "True" sinon "False".
    public boolean authenticate(String username, String password) {
        if (null == loginList) {
            throw new IllegalStateException("The login list isn't initialised");
        }

        return loginList.stream()
                .filter(usern -> usern.getUsername().equals(username))
                .filter(passw -> passw.getPassword().equals(password))
                .findFirst()
                .isPresent();
    }

    //Ajoute un joueur dans le fichier texte.
    public void inscription(String username, String password) throws IOException, UsernameException, PasswordException {
        // On vérifie que le nom d'utilisateur n'existe déjà pas.

        Iterator<User> it = loginList.iterator();
        while (it.hasNext()) {
            User u = (User) it.next();
            if (username.equals(u)) {
                throw new UsernameException("This username already exist.");
            }
        }
        // On vérifie que le nom de l'utilisateur ne soit pas vide.
        if (username.length() == 0 || username.length() == 1) {
            throw new UsernameException("The username must contain at least two elements.");
        }
        // On vérifie que le nom de l'utilisateur doit commencer par une majuscule.
        if (username.charAt(0) > 'Z' || username.charAt(0) < 'A') {
            throw new UsernameException("The username must begin with an uppercase.");
        }
        // On vérifie que le nom de l'utilisateur ne doit contenir que des minuscules et des chiffres.
        for (int i = 1; i < username.length(); i++) {
            if ((username.charAt(i) > 'z' || password.charAt(i) < 'a') && (username.charAt(i) > '9' || username.charAt(i) < '0')) {
                throw new UsernameException("The username must contain only lowercase and numbers after the first element.");
            }
        }
        // On vérifie que le mot de passe de l'utilisateur ne soit pas vide.
        if (password.length() == 0 || username.length() == 1) {
            throw new PasswordException("The password must contain at least two elements.");
        }
        // On vérifie que le mot de passe de l'utilisateur doit commencer par une majuscule.
        if (password.charAt(0) > 'Z' || password.charAt(0) < 'A') {
            throw new PasswordException("The password must begin with an uppercase.");
        }
        // On vérifie que le mot de passe de l'utilisateur ne doit contenir que des minuscules et des chiffres.
        for (int i = 1; i < password.length(); i++) {
            if ((password.charAt(i) > 'z' || password.charAt(i) < 'a') && (password.charAt(i) > '9' || password.charAt(i) < '0')) {
                throw new PasswordException("The password must contain only lowercase and numbers after the first element.");
            }
            Writer output;
            output = new BufferedWriter(new FileWriter("src/boitedejeux/Logins.txt", true));
            output.append("\n" + username + ", " + password+", 0, 0");
            output.close();
        }
    }
}

Score

package boitedejeux;

public class Score {

    private int victory;
    private int defeat;

    public Score(int victory, int defeat) {
        this.victory = victory;
        this.defeat = defeat;
    }

}

Login.txt

Username, Password, 0, 0
Test, Test, 0, 0

Ошибка

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
    at java.lang.String.charAt(String.java:658)
    at boitedejeux.UserList.inscription(UserList.java:70)
    at boitedejeux.BoiteDeJeux.main(BoiteDeJeux.java:17)
C:\Users\aabdo\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 5 seconds)

Я не знаю, может ли это помочь, но имя пользователя и пароль, которые я дал, соответственно: "Test2" и "Test".

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 05 июня 2018
if ((username.charAt(i) > 'z' || password.charAt(i) < 'a') && (username.charAt(i) > '9' || username.charAt(i) < '0')) {
            throw new UsernameException("The username must contain only lowercase and numbers after the first element.");
        }

обратите внимание, что вторая строка - это пароль, а не имя пользователя.

и этот цикл должен начинаться с i = 0

...