java:'string index超出范围:-1'异常使用indexOf()

时间:2012-06-02 03:46:24

标签: java string indexof indexoutofboundsexception

奇怪的问题。我运行这个(非常基本的)程序来查找文件中的用户名和密码,程序应该将输入的密码与保存的密码进行比较。然而,每次我都会遇到一个奇怪的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()不想在用连字符(' - ')替换时找到'。' - 但是,它看起来很完美!

3 个答案:

答案 0 :(得分:2)

我认为错误就在这一行:

String Pass = logdat.substring(startPass, passend);

出于某种原因(您必须确定原因),您可以通过在字符串中搜索passend来计算.。如果.不存在,indexOf将返回-1作为哨兵。但是,这不是导致异常的行。我认为这是上面的一行,因为如果你在passend为-1时尝试计算以passend结尾的子字符串,你会得到上述错误。

尝试确定字符串中不包含.的原因。

希望这有帮助!

答案 1 :(得分:1)

indexOf()返回-1时,表示无法在字符串中找到该值。因此,在这种情况下,您正在搜索字符串中不存在的'.'字符串。

我建议您在通话后始终检查indexOf()的值,并正确处理-1。在许多情况下,它可能足以将其设置为0string.length(),具体取决于您稍后在代码中使用它的方式。

无论如何,如果您希望'.'存在而且没有,则需要调试代码以找出值是什么,以及'.'的位置不见了。

答案 2 :(得分:0)

如果找不到指定的字符串,

indexOf()将返回-1

问题出在Line:

String Pass = logdat.substring(startPass, passend);

因为负面指数。