3

奇妙な問題。この(非常に基本的な)手順を実行してファイル内のユーザー名とパスワードを検索すると、プログラムは入力されたパスワードと保存されたパスワードを比較する必要があります。ただし、毎回、奇妙な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()はハイフン('-')に置き換えられたときに'.'-を見つけたくありませんが、一見完全に実行されます!

4

3 に答える 3

2

エラーは次の行にあると思います。

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

何らかの理由で(理由を特定する必要があります)、文字列passendを検索して計算し.ます。.が存在しない場合はindexOf、番兵として-1を返します。ただし、これは例外の原因となる行ではありません。-1で終わる部分文字列を計算しようとすると、上記のエラーが発生するため、passend上記の行だと思います。passend

文字列にが含まれていない理由を特定してみてください.

お役に立てれば!

于 2012-06-02T03:51:17.723 に答える
1

indexOf()を返す場合は-1、文字列に値が見つからなかったことを意味します。したがって、この場合は、文字列に'.'存在しない文字列を検索しています。

呼び出し後の値を常に確認し、適切に処理することをお勧めします。多くの場合、後でコードでどのように使用するかに応じて、またはのいずれかに設定するだけで十分です。indexOf()-10string.length()

とにかく、が存在することを期待していて存在しない場合は、コードをデバッグして、値が何であるか、およびが欠落'.'している場所を見つける必要があります。'.'

于 2012-06-02T03:53:08.550 に答える
0

indexOf()-1指定された文字列が見つからない場合に戻ります 。

問題は次のとおりです。

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

負のインデックスのため。

于 2012-06-02T03:53:56.567 に答える