0

新しいコード:

ここで何が起こっているのかわかりません。次のエラーが表示されます。

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.frausername:password実行時に含まれます。

注:98行目は

char [] Passwd = Pass.toCharArray();

宿題ではなく、個人的なプロジェクトです。

ユーザー名が にないイベントを処理するメソッドを追加しますusers.fra

4

5 に答える 5

3

indexOf()引数が見つからない場合は -1 を返します。検索している文字列には、検索している文字が含まれておらず、部分文字列を取得しようとすると無効なインデックスが発生していると思います。

于 2012-05-30T14:26:21.107 に答える
3

-1を返し、-1の位置で部分文字列を取得しようとする状況を回避するために、文字列のcontains()前に使用してみてください。indexOf()indexOf()

于 2012-05-30T14:27:45.293 に答える
2

String().indexOf一致しない場合は -1 を返します

String().substringStringIndexOutOfBoundsException負の値を指定すると、がスローされbeginます。

これはすべてhttp://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.htmlで文書化されています

したがって、次のコード行を見てください。

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

にない場合、これは失敗usnmしますlogindat

于 2012-05-30T14:28:39.793 に答える
0

これらの行を実際に確認する必要があります。

        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 //最初の文字
  • tenUsnm = 4 // :charのインデックス
  • endUsnm = 4 // 合計? これはおそらくあなたが意図していることではありません
  • startPass = 5 //p文字
  • テンパス = 9 //.文字
  • endPass = 14 // もう一度合計しますか? これらの整数はインデックスです - IndexOutOfBounds をスローします

また、 given にそのような一致がない場合は値indexOfを返すことも考慮してください。-1String

于 2012-05-30T14:43:42.730 に答える
0

多くのことが間違っている可能性があります。印刷されたものを確認する必要があります。

例:

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

logindat に "Username: " がない場合、表示される例外が生成されます。

編集:「ユーザー名:」(「ユーザー名:」だけでなく)を許可したい場合は、次のようにすることができます:

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

そして、startUsnm が >= 0 であることをテストします。

于 2012-05-30T14:26:51.787 に答える