奇怪的问题。我运行这个(非常基本的)程序来查找文件中的用户名和密码,程序应该将输入的密码与保存的密码进行比较。然而,每次我都会遇到一个奇怪的String index out of range: -1
异常。我之前遇到过类似的问题,但这次indexOf('.')
来电正在返回-1
;它不喜欢。如果indexOf()
导致错误,为什么会-1
返回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)
这是一些输入/输出:
{{1}}
编辑:解决方案找到了!
出于某种原因,indexOf()不想在用连字符(' - ')替换时找到'。' - 但是,它看起来很完美!
答案 0 :(得分:2)
我认为错误就在这一行:
String Pass = logdat.substring(startPass, passend);
出于某种原因(您必须确定原因),您可以通过在字符串中搜索passend
来计算.
。如果.
不存在,indexOf
将返回-1作为哨兵。但是,这不是导致异常的行。我认为这是上面的一行,因为如果你在passend
为-1时尝试计算以passend
结尾的子字符串,你会得到上述错误。
尝试确定字符串中不包含.
的原因。
希望这有帮助!
答案 1 :(得分:1)
当indexOf()
返回-1
时,表示无法在字符串中找到该值。因此,在这种情况下,您正在搜索字符串中不存在的'.'
字符串。
我建议您在通话后始终检查indexOf()
的值,并正确处理-1
。在许多情况下,它可能足以将其设置为0
或string.length()
,具体取决于您稍后在代码中使用它的方式。
无论如何,如果您希望'.'
存在而且没有,则需要调试代码以找出值是什么,以及'.'
的位置不见了。
答案 2 :(得分:0)
indexOf()
将返回-1
。
问题出在Line:
String Pass = logdat.substring(startPass, passend);
因为负面指数。