1

私は、非常に基本的なログイン機能を必要とする学校向けのプロジェクトに取り組んでいます (パスワードがプレーンテキストのままであることを考えると、あまり派手ではありません)。私はテスト データベースを持っており、データベースから参照および取得されるすべての値も適切に表示できることを徹底的にテストしました。コードで、比較される各変数の型が String 型であることがわかります。あなたへの私の質問は、変数 userOut と un が等しくないのはなぜですか? (私は、それらのそれぞれで .toString() メソッドを個別に使用することも、一緒に使用して、それらを「等しい」ようにすることも試みました)。

    public static void main(String[] args) throws SQLException {

    try {

        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/users", "root", "Hsiri0758");
        System.out.println("Database connected...");

        Statement stat = conn.createStatement();
        Statement pwstat = conn.createStatement();

        Scanner scan = new Scanner(System.in);
        System.out.println("Username: ");
        String un = scan.nextLine();
        System.out.println("Password: ");
        String pw = scan.nextLine();

        ResultSet unRset = stat.executeQuery("SELECT username FROM accounts WHERE username = \"" + un + "\";");
        unRset.next();
        String userOut = unRset.getString(1);

        ResultSet pwRset = pwstat.executeQuery("SELECT password FROM accounts WHERE password = \"" + pw + "\";");
        pwRset.next();
        String pwordOut = pwRset.getString(1);

        if (userOut == un) {
            System.out.println("Welcome " + un + "!");
        }
        else {
            System.out.println("Invalid username.");
        }

        conn.close();
        }
        catch (SQLException ex) {
        ex.printStackTrace();
        }

    }
4

7 に答える 7

2

Java1のメソッドと値を比較する必要があるようなプリミティブは別として。equals()

したがって、コードでは、これは次のことを意味しますuserOut.equals(un)

最終的には、次のようになります。

if (userOut.equals(un)) {
    System.out.println("Welcome " + un + "!");
}

Stringsを避けることができるので、機会があれば、既知の a を入力と比較する必要がありますNullPointerException

よくある問題:

public void someMethod(String someParameter) {
    if(someParameter.equals(MY_CONSTANT)) {
        // ...
    }
}

これは次のようにリファクタリングする必要があります。

public void someMethod(String someParameter) {
    if(MY_CONSTANT.equals(someParameter)) {
        // ...
    }
}
于 2013-11-12T15:47:20.780 に答える
2

if (userOut == un) { この行を if (userOut.equals( un)){に置き換えます

との詳細については、これを参照してください。==.equals()

于 2013-11-12T15:46:28.360 に答える
0

これは、String がデータ型ではなくクラスであるためです。実際には、実際の文字列ではなく、2 つのクラス参照を互いに比較しているだけです。String の 2 つのインスタンスの内容を比較するには、クラス デザイナーが提供する equal() を使用する必要があります。

userOut.equals(un)
于 2013-11-12T15:55:21.077 に答える
0

Java で演算子を使用する==と、参照変数が同じ文字列を参照しているかどうかを確認するだけです。したがって、あなたの場合、これは常に false と評価されます。

文字列を単純に比較するには、 を試してくださいuserOut.equals(un)。これにより、文字列の実際の内容が等しいかどうかがチェックされます。そうであれば、true を返します。

詳細については、
http ://www.thejavageek.com/2013/07/27/string-comparison-with-equals-and-assignment-operator/ をご覧ください。

于 2013-11-12T15:51:07.773 に答える
0

文字列を比較している場合は、equals代わりに使用してみてください==

トラブルequalsIgnoreCase回避にも使えますcase sensitive

于 2013-11-12T15:47:08.410 に答える
0

Java でオブジェクトを比較するには、「==」演算子の代わりに .equals() メソッドを使用します

次のコードを置き換えます

 if (userOut == un) 

 if (userOut.equals(un)) 

ケースを無視したい場合は、以下のように使用します

 if (userOut.equalsIgnoreCase(un)) 
于 2013-11-12T15:47:54.387 に答える
0

== は、javascript や jquery などのクライアント側スクリプトで使用されます。サーバー側には equals または equalsIgnoreCase が必要です。

于 2013-11-12T15:52:31.280 に答える