2

人々が以前にこの質問をしたことは知っていますが、彼らは.equals(). もう一度質問します。なぜ 2 つの文字列があるのですが、それらを比較すると.equals()false になります。2 つの文字列は 1234 (passwordField2.getPassword()およびString s = bufferedreader.readLine().) です。s.toCharArray を使用してそれらを比較しましたが、同じことが言えます。両方を印刷してみましたが、 1234 1234

なぜこれが起こっているのか誰にも分かりますか?ありがとうございました!

4

2 に答える 2

5

JavaDocsを見ると、passwordField2.getPassword()が返されますchar[]

次のコードが機能するはずです。

boolean passwordsMatch = bufferedreader.readLine().equals(
    new String(passwordField2.getPassword())
);

このコードは、 を String に変換しchar[]て元の値と比較できるように機能しStringます。

編集:アレックス L. が回答で述べているようにJPasswordField、セキュリティ上の目的でパスワードを文字配列として保存します。

したがって、このコードを記述するより良い方法は次のようになります。

boolean passwordsMatch = Arrays.equals(
    passwordField2.getPassword(), 
    bufferedreader.readLine().toCharArray()
);
于 2016-02-11T03:11:57.970 に答える
2

他の回答を他のいくつかのポイントと組み合わせると、いくつかの問題があります。

2 番目のパスワードに余分な空白があります。そうしないと、先頭と末尾の空白が無視されるため、文字列をトリミングしないでください。これは悪い習慣です。

また、JPasswordFieldschar[]を呼び出すとa が返され (ここでgetPassword()理由を読む)、文字配列が文字列と等しくなることはありません。この問題を (セキュリティの観点から) 解決する最善の方法は、パスワードを文字配列として格納することです。次に、パスワードが等しいかどうかを確認するために使用できます。Arrays.equals(arr1, arr2)

于 2016-02-11T03:24:36.967 に答える