java: 'string index out of range: -1' 异常使用 indexOf()

标签 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)

编辑:找到解决方案!

出于某种原因,indexOf() 不想找到 '.'- 当用连字符 ('-') 替换时,然而,它运行完美,看起来!

最佳答案

我认为错误在这一行:

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

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

尝试确定为什么您的字符串中不包含 .

希望这对您有所帮助!

关于java: 'string index out of range: -1' 异常使用 indexOf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10859633/

相关文章:

Java - 将 List<String> 拆分为...子列表?

Java:空白索引问题

c++ - 如何指定 QString::indexOf 方法对两个单词之间的空格数不敏感?

java - 批量删除具有给定属性(或多个属性)的所有实体

java - Java服务器客户端程序

java - 对树状图进行排序并没有真正起作用

c# - 为什么这个 List<>.IndexOf 代码比 List[i] 和手动比较快得多?

java - LibGDX 和 GoogleApiClient 设置/集成(第一次)

c++ - CPP 中字符串的内存管理问题

c# - 字符串行为的解释