при попытке добавить пользователя в мой список входа в систему, который представляет собой текстовый файл, я всегда получаю сообщение об ошибке, которое абсолютно не понимаю.
Мой код в основном выполняет две вещи.Сначала он сравнивает имя пользователя и пароль, заданные пользователем, чтобы увидеть, присутствует ли он уже в списке входа (текстовый файл).Во-вторых, он позволил пользователю зарегистрироваться, другими словами, добавил в список входа в систему.
Сейчас я пытаюсь добавить систему оценок, где для каждого пользователя есть количество побед и поражений для игр, которыеЯ создам позже.
Вот мой код:
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".
Заранее спасибо за помощь.