java:’string index超出范围:-1’exception使用indexOf()
奇怪的问题。 我运行这个(非常基本的)程序来查找文件中的用户名和密码,程序应该将输入的密码与保存的密码进行比较。 但是,每次我得到一个奇怪的String index out of range: -1
exception。 我之前遇到过类似的问题,但这次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.(client0_0_2.java:221) at client0_0_2.main(client0_0_2.java:228)
编辑:找到解决方案!
出于某种原因,indexOf()不想在用连字符(’ – ‘)替换时找到’。’ – 但是,它看起来很完美!
我认为错误在这一行:
String Pass = logdat.substring(startPass, passend);
出于某种原因(您必须确定原因),您passend
通过搜索来计算passend
.
在字符串中。 如果.
如果不存在, indexOf
将返回-1作为标记。 但是,这不是导致exception的行。 我认为这是上面的行,因为如果你尝试计算passend
为-1时在passend
结束的子字符串,你会得到上面的错误。
尝试确定您的字符串不包含的原因.
在里面。
希望这可以帮助!
当indexOf()
返回-1
,表示在String中找不到该值。 因此,在这种情况下,您正在搜索字符串'.'
字符串中不存在。
我建议您在调用后始终检查indexOf()
的值,并正确处理-1
。 在许多情况下,它可能足以将其设置为0
或string.length()
,具体取决于稍后在代码中使用它的方式。
无论如何,如果你期待一个'.'
要存在且没有一个,你需要通过代码调试来找出值是什么,以及'.'
位置'.'
不见了。
如果找不到指定的字符串, indexOf()
将返回-1
。
问题在于:
String Pass = logdat.substring(startPass, passend);
因为负面指数。
- 使C fork代码适应Java程序
- 线程“JavaFX Application Thread”中的exceptionjava.lang.IllegalArgumentException:参数类型不匹配