【问题标题】:Java: String index out of range: -1Java:字符串索引超出范围:-1
【发布时间】:2012-06-04 19:16:31
【问题描述】:

新代码:

我不知道这里发生了什么,我收到了这个错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1949)
    at client0_0_2.loginToClient(client0_0_2.java:98)
    at client0_0_2.general(client0_0_2.java:196)
    at client0_0_2.<init>(client0_0_2.java:208)
    at client0_0_2.main(client0_0_2.java:215)

这是导致错误的方法的内容:

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);
        int startUsnm = logindat.indexOf(usnm);
        String logdat = logindat.substring(startUsnm, logindat.indexOf("."));
        if (startUsnm == -1) {
            System.err.println("Username not recognised, please try another or create user.");
            usnm = "INV";
            return usnm;
        }
        else {
            int tendUsnm = logdat.indexOf(':'); 
            int startPass = endUsnm + 1;
            int tendPass = logdat.indexOf('.');
            String Usnm = logdat.substring("0", tendUsnm);
            String Pass = logdat.substring(startPass, endPass);
            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;
}

它看起来有点像它试图访问某些东西的最后一个字符,这让它感到不安,但我不知道为什么。对新手有什么帮助吗?

编辑:

users.fra 在执行时包含username:password

注意:第 98 行是

char [] Passwd = Pass.toCharArray();

n.b.不是家庭作业,是个人项目。

将添加一个方法来处理用户名不在users.fra中的事件。

【问题讨论】:

  • 请提供导致此行为的示例
  • 我不认为这是第 98 行 char [] Passwd = Pass.toCharArray();
  • 我相信编译器可能已经查明了错误的行,就像它有时那样。

标签: java string range out


【解决方案1】:

indexOf() 在找不到参数时返回 -1。我敢打赌,您正在搜索的字符串没有您正在搜索的字符之一,当您尝试获取子字符串时,它会导致索引无效。

【讨论】:

  • 谢谢!它不应该是......它在一个只包含“用户名:密码”的文件中找到了一个纯文本用户名和密码,所以我认为我搞砸了其中一个搜索......
【解决方案2】:

尝试在indexOf() 之前使用contains() 作为你的字符串以避免indexOf() 返回-1 并且您尝试获取具有-1 位置的子字符串的情况。

【讨论】:

  • 我应该如何使用contains()
  • 例如:if(myString.contains(someChar) &amp;&amp; myString.contains(someOhterChar)) { String subString = myString.substring(myString.indexOf(someChar), myString.indexOf(someOhterChar))
【解决方案3】:

String().indexOf 如果没有匹配,将返回 -1

如果你给begin 一个负值,String().substring 将抛出一个StringIndexOutOfBoundsException

这一切都记录在http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

因此,我会看看这行代码:

String logdat = logindat.substring(startUsnm, logindat.indexOf("."));

如果usnm 不在logindat 中,这将失败

【讨论】:

  • substring() 抛出:IndexOutOfBoundsException - 如果 beginIndex 为负数,或者 endIndex 大于此 String 对象的长度,或者 beginIndex 大于 endIndex。
【解决方案4】:

你真的应该看看那些行:

        int startUsnm = logindat.indexOf(usnm);
        int tendUsnm = logdat.indexOf(':');
        int endUsnm = startUsnm + tendUsnm;
        int startPass = endUsnm + 1;
        int tendPass = logdat.indexOf('.');
        int endPass = startPass + tendPass;
        String Usnm = logindat.substring(startUsnm, endUsnm);
        String Pass = logindat.substring(startPass, endPass);

假设你有这样的文件:


用户:通过。


所以:

  • startUsnm = 0 //第一个字符
  • tendUsnm = 4 //:char 的索引
  • endUsnm = 4 // 总和?这可能不是您打算做的事情
  • startPass = 5 //pchar
  • tendPass = 9 //.char
  • endPass = 14 // 再次求和?这些整数是索引 - 将抛出 IndexOutOfBounds

如果在给定的String 中没有这样的匹配,还要考虑indexOf 将返回-1 值。

【讨论】:

  • 如果需要的用户名不是 users.fra 文件中的第一个用户名,则求和整数; id est,它可能包含“username:password.usrn:pass”。我只寻找 usrn,而不是用户名。这应该给我用户名末尾相对于整个字符串的位置。我刚刚意识到这是一个毫无意义的练习,因为我有一个字符串,它只是 usrn 到 "." 的索引......现在将进行调整。
【解决方案5】:

很多事情都可能是错误的。您必须检查打印的内容。

一个例子:

int startUsnm = logindat.indexOf(usnm);
String logdat = logindat.substring(startUsnm, logindat.indexOf("."));

如果您在 logindat 中没有“用户名:”,则会产生您看到的异常。

编辑:请注意,如果您想允许“用户名:”(而不仅仅是“用户名:”),您可以这样做:

 int startUsnm = logindat.toLowerCase().indexOf("username:");

并测试 startUsnm >= 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2012-01-15
    相关资源
    最近更新 更多