Странная проблема. Я запускаю эту (очень элементарную) процедуру, чтобы найти имя пользователя и пароль в файле, а программа должна сравнить введенный пароль с сохраненным паролем. Однако каждый раз я получаю странное исключение String index out of range: -1
. Раньше у меня была аналогичная проблема, однако на этот раз звонок indexOf('.')
возвращает -1
; который ему не нравится. Почему indexOf()
возвращает -1
, если это вызывает ошибку? Вот источник:java: 'string index out the range: -1' exception using indexOf()
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;
}
А вот некоторый ввод/вывод:
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: РЕШЕНИЕ НАЙДЕНО!
По какой-то причине indexOf() не хочет находить '.'- при замене дефиса (' - '), однако, он работает отлично, казалось бы!
Помните: «первый» индекс равен 0. «-1» означает «не найден»? Как * else * вы хотите, чтобы «indexOf()» возвращал значение «not found»? Выброс исключения может быть законным выбором. Но разве вы не просто проверили бы «-1»? Что вы можете легко найти, посмотрев Javadocs на ["String"] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html) – paulsm4
В той же проблеме, где точка определенно существует в строке, но как-то indexOf ('.') возвращает -1. – lrl