新代码:
我不知道这里发生了什么,我收到了这个错误:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1949)
at client0_0_2.loginToClient(client0_0_2.java:98)
at client0_0_2.general(client0_0_2.java:196)
at client0_0_2.<init>(client0_0_2.java:208)
at client0_0_2.main(client0_0_2.java:215)
这是造成错误的方法的内容:
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);
int startUsnm = logindat.indexOf(usnm);
String logdat = logindat.substring(startUsnm, logindat.indexOf("."));
if (startUsnm == -1) {
System.err.println("Username not recognised, please try another or create user.");
usnm = "INV";
return usnm;
}
else {
int tendUsnm = logdat.indexOf(':');
int startPass = endUsnm + 1;
int tendPass = logdat.indexOf('.');
String Usnm = logdat.substring("0", tendUsnm);
String Pass = logdat.substring(startPass, endPass);
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;
}
它看起来有点像是试图访问某些内容的最后一个字符并且令它感到不安,但我不知道为什么。总新手的任何帮助?
编辑:
users.fra
在执行时包含username:password
。
注意:第98行是
char [] Passwd = Pass.toCharArray();
n.b。不是家庭作业,个人项目。
将添加一个方法来处理用户名不在users.fra
。
答案 0 :(得分:3)
indexOf()
返回-1。我敢打赌,您搜索的字符串没有您要搜索的字符之一,并且当您尝试获取子字符串时,它会导致无效索引。
答案 1 :(得分:3)
尝试在contains()
之前使用indexOf()
作为字符串,以避免indexOf()
返回-1并尝试获取-1位的子字符串时的情况。
答案 2 :(得分:1)
String().indexOf
将返回-1
String().substring
如果您给它StringIndexOutOfBoundsException
值为begin
,则会抛出String logdat = logindat.substring(startUsnm, logindat.indexOf("."));
。
这些都记录在http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html
因此,我要看一下这行代码:
usnm
如果logindat
答案 3 :(得分:0)
很多事情都可能是错的。你必须检查打印的内容。
一个例子:
int startUsnm = logindat.indexOf(usnm);
String logdat = logindat.substring(startUsnm, logindat.indexOf("."));
如果您没有&#34;用户名:&#34;在logindat中,它会产生您看到的异常。
编辑:请注意,如果您想允许&#34;用户名:&#34; (而不仅仅是&#34;用户名:&#34;),你可以这样做:
int startUsnm = logindat.toLowerCase().indexOf("username:");
测试startUsnm是&gt; = 0。
答案 4 :(得分:0)
你应该看看这些界限:
int startUsnm = logindat.indexOf(usnm);
int tendUsnm = logdat.indexOf(':');
int endUsnm = startUsnm + tendUsnm;
int startPass = endUsnm + 1;
int tendPass = logdat.indexOf('.');
int endPass = startPass + tendPass;
String Usnm = logindat.substring(startUsnm, endUsnm);
String Pass = logindat.substring(startPass, endPass);
假设你有这样的文件:
用户:通
这样:
:
char p
char .
char 如果在给定indexOf
中没有此类匹配,-1
也会返回String
值。