java:’string index超出范围:-1’exception使用indexOf()

奇怪的问题。 我运行这个(非常基本的)程序来查找文件中的用户名和密码,程序应该将输入的密码与保存的密码进行比较。 但是,每次我得到一个奇怪的String index out of range: -1exception。 我之前遇到过类似的问题,但这次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 。 在许多情况下,它可能足以将其设置为0string.length() ,具体取决于稍后在代码中使用它的方式。

无论如何,如果你期待一个'.' 要存在且没有一个,你需要通过代码调试来找出值是什么,以及'.'位置'.' 不见了。

如果找不到指定的字符串, indexOf()将返回-1

问题在于:

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

因为负面指数。