Java 爪哇:';字符串索引超出范围:-1';使用indexOf()时出现异常

Java 爪哇:';字符串索引超出范围:-1';使用indexOf()时出现异常,java,string,indexof,indexoutofboundsexception,Java,String,Indexof,Indexoutofboundsexception,奇怪的问题。我运行这个(非常基本的)过程在文件中查找用户名和密码,程序应该比较输入的密码和保存的密码。然而,每次我都会得到一个奇怪的字符串索引超出范围:-1异常。我以前遇到过类似的问题,但是这次indexOf('.')调用返回-1;它不喜欢。如果导致错误,为什么indexOf()返回-1?以下是消息来源: public String loginToClient() throws FileNotFoundException, IOException { //decryptUsers

奇怪的问题。我运行这个(非常基本的)过程在文件中查找用户名和密码,程序应该比较输入的密码和保存的密码。然而,每次我都会得到一个奇怪的
字符串索引超出范围:-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)
启动已启动。
日志文件存在。
用户文件存在。
新用户?N
其他的
登录
用户名:rik
密码:
里克:55。
startUsnm:0
endUsnm:3
起始时间:4
端通行证:-1
Usnm:rik
线程“main”java.lang.StringIndexOutOfBoundsException中出现异常:字符串索引超出范围:-5
位于java.lang.String.substring(String.java:1949)
在client0_0_2.loginToClient(client0_0_2.java:103)
at client0_0_2.general(client0_0_2.java:209)
在client0\u0\u2。(client0\u0\u2.java:221)
在client0_0_2.main上(client0_0_2.java:228)
编辑:找到解决方案


出于某种原因,indexOf()不希望找到“.”-当替换为连字符(“-”)时,它似乎运行得很好

我认为错误在这一行:

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

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

希望这有帮助

indexOf()
返回
-1
时,表示在字符串中找不到该值。因此,在本例中,您正在搜索字符串中不存在的

我建议您在调用后始终检查
indexOf()
的值,并正确处理
-1
。在许多情况下,将其设置为
0
string.length()
,可能就足够了,这取决于您以后在代码中如何使用它

无论如何,如果您希望存在一个
,但没有,则需要对代码进行调试,以找出值是什么,以及
缺少的位置。

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

问题在于:

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

由于索引为负数。

-第二次运行此操作(经过修改),它似乎从结尾删除了一个字符-之前没有这样做过…-忽略这一点哦,还有-永远不要以纯文本形式存储密码!这是一场即将发生的安全噩梦。谢谢,我知道xD我只是有点不知所措,加密让我有点困惑,所以我在整理简单的东西时坚持使用纯文本。我正在准备加密,正如您可以从注释掉的方法调用xP中看到的,谢谢您,绝对是个好建议!:你不需要加密。你只需要应用一个散列函数(我建议使用SHA2),保存密码的散列,并在使用相同的函数进行散列后将其与用户输入进行比较。非常感谢,sergi:D我明天将在重新开始此工作时执行此操作。请记住:“第一个”索引为0。“-1”表示“未找到”?您还希望“indexOf()”返回“notfound”的值吗?抛出异常可能是一个合理的选择。但你不想检查一下“-1”吗?您可以通过查看的Javadocs很容易找到,它遇到了相同的问题,其中点肯定存在于字符串中,但不知何故indexOf('.')返回-1。看起来点肯定存在,当打印搜索的字符串时,它(现在)包含它。它似乎仍在返回-1:我将使用string.length():D非常好的建议,谢谢。我可以问一下,你为什么要这样做<代码>int passend=endPass-1?当您调用
indexOf(“.”
时,它将返回紧靠
之前的位置索引。我假设您正在执行
endPass-1
以尝试从
子字符串()中删除点,在这种情况下,这是不需要的,这就是您的错误所在。我相信这可能是问题的原因之一-即使删除了该行,它也没有检测到点;我把它改成了连字符,效果很好。谢谢,不过,这也会导致错误!