java - java:使用indexOf()的字符串索引超出范围:-1

原文 标签 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 - 在HTML表单中,能否仅基于复选框的值显示/选择按钮?

java - Java动画旋转

c# - 如何从字符串中按顺序获取找到的字符并保留重复项以将其添加到列表中而不会覆盖以前的字符

javascript - indexOf如何返回此示例的位置,结果不应该为-1?

java - Java中不使用hashmap的重复字符计数

javascript - 为什么将对象推入数组后indexOf不起作用

java - 为什么GMail接受未经身份验证的邮件发送?

java - Java和JNI(dll)之间的索引超出范围的异常

windows - 如何使用Windows命令行查找文件中字符串的出现次数?

ruby-on-rails - Rails 3和Gettext(fast_gettext),字符串的 undefined 方法“add”非常奇怪