2013-02-03 28 views
0

當我編譯下面的代碼時,它顯示(字符串)用戶名和myList.get(0)相等,但返回false的equals函數爲什麼密碼也會發生同樣的情況。爲什麼等於功能不起作用?

btnLogIn.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) { 

    String Username=(String) textField.getText(); //fatch the user name from text field 
    String Password=(String) textField_1.getText(); //fatch password frof text field 
    databaseconnection connect = new databaseconnection(); // databaseconnection class object to connect to data base 
    ArrayList myList = connect.search(Username,Password); //serch the username and password in data base 
      System.out.println((String)myList.get(0)); //for testing 
      System.out.println((String)myList.get(1)); //for testing 
      System.out.println(Username);    //for testing 
      System.out.println(Password);    //for testing 
      System.out.println(Username.equals(myList.get(0))); //for testing 
      System.out.println(Password.equals((String)myList.get(1))); //for testing 
      if(Username.equals(myList.get(0))&&Password.equals((String)myList.get(1))){ 
      System.out.println("Hello"+Username); 
      } 
     } 
    }); 

enter image description here

這是我的DatabaseConnection類

import java.sql.*; 
    import java.util.ArrayList; 

public class databaseconnection{ 
Statement stmt ; 
ResultSet rs ; 
Connection conn; 
ArrayList<String> temp = new ArrayList<String>(); 

public void getconnection(){ 

try{ 


    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

    Connection conn = DriverManager.getConnection("jdbc:odbc:Database1","",""); 

    stmt = conn.createStatement(); 


} 
catch(Exception e){ 
    System.out.println("connection error"); 
} 
} 
public ArrayList search(String Username,String Password){ 

    getconnection(); 
    try{ 
    rs = stmt.executeQuery("select username,password from login where username = \'"+Username+"\'"); 
    if(rs.next()){ 
    String tempString=rs.getString("username"); 
    temp.add(tempString); 
    tempString= rs.getString("password"); 
    temp.add(tempString); 
    } 
    } 
    catch(Exception e){ 
    System.out.println("search error"); 
    } 
    return temp; 
    } 

    } 
+5

可能在這裏或那裏演員,但你是Count Castula。打破這種習慣... – Rob

+0

我試過了,但結果相同 –

+0

它不會改變結果。爲什麼列表沒有參數化? – Rob

回答

1

我改寫你的代碼爲:

String Username = "user"; 
String Password = "pass"; 

List<String> myList = new ArrayList<>(); 
myList.add("user"); 
myList.add("pass"); 

System.out.println(Username); 
System.out.println(Password); 
System.out.println(myList.get(0)); 
System.out.println(myList.get(1)); 
System.out.println(Username.equals(myList.get(0))); 
System.out.println(Password.equals(myList.get(1))); 

if (Username.equals(myList.get(0)) && Password.equals(myList.get(1))) { 
    System.out.println("Hello, " + Username); 
} 

現在它可以工作。注意List聲明後的<String>。這就是所謂的generics,並說只有Strings可以列入名單。它也消除了任何需要明確轉換的問題,這種轉換很容易出錯,只有在確定可以安全地進行時才應該這樣做。

如果您根據此更改了代碼,但仍未得到正確的結果,請確保您連接的值是正確的,並且不包含任何形式的不可見字符。


另外,在Java中,變量名通常在lowerCamelCase中。類名應該在UpperCamelCase。見Java naming conventions

Don't forget to close your connections!Java 7 automatic resource management幫助你。在一般情況下,您還應該處理任何連接錯誤。

這是一個好主意,通過他們的工作來命名變量。因此,你的代碼應該看起來更像是這樣的:

public void actionPerformed(ActionEvent e) { 
    String username = "user"; 
    String password = "pass"; 

    List<String> dtbSearchResults; 
    try (DatabaseConnection connection = new DatabaseConnection()) { 
     dtbSearchResults = connection.search(username, password); 
    } catch (SomeExceptionYouReallyShouldHandle e) { 
     // seriously, handle it here 
    } 

    System.out.println(username); 
    System.out.println(password); 
    System.out.println(dtbSearchResults.get(0)); 
    System.out.println(dtbSearchResults.get(1)); 
    System.out.println(username.equals(dtbSearchResults.get(0))); 
    System.out.println(password.equals(dtbSearchResults.get(1))); 

    if (username.equals(dtbSearchResults.get(0)) && password.equals(dtbSearchResults.get(1))) { 
     System.out.println("Hello, " + username); 
    } 
} 

它仍然不是很完美,因爲search()方法應該返回UserCredentials類型的實例或者基於它究竟應該做的List<UserCredentials>一個實例。然後UserCredentials應該是這樣的:

public class UserCredentials { 

    private final String username; 
    private final String password; 

    public UserCredentials(String username, String password) { 
     // maybe some validity checks 
     this.username = username; 
     this.password = password; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public String getPassword() { 
     return password; 
    } 

} 

有了這個類實現的,你的代碼應該是這樣的(假設search()應該只返回一個結果):

public void actionPerformed(ActionEvent e) { 
    String username = "user"; 
    String password = "pass"; 

    UserCredentials user; 
    try (DatabaseConnection connection = new DatabaseConnection()) { 
     user = connection.search(username, password); 
    } catch (SomeExceptionYouReallyShouldHandle e) { 
     // seriously, handle it here 
    } 

    System.out.println(username); 
    System.out.println(password); 
    System.out.println(user.getUsername()); 
    System.out.println(user.getPassword()); 
    System.out.println(username.equals(user.getUsername())); 
    System.out.println(password.equals(user.getPassword())); 

    if (username.equals(user.getUsername()) 
      && password.equals(user.getPassword())) { 
     System.out.println("Hello, " + username); 
    } 
} 

請詢問任何其他問題,如果你有任何。

+0

thanx,但我仍然遇到麻煩................ –

+0

@RaviKumarMistry嘗試解決你一段時間的新問題,然後開始一個新的問題與它,如果你不成功。 –

+0

編譯器顯示未安裝或不安全操作的警告 –

0

定義myList中類型ArrayList<String>

+0

它是數組列表 –

+0

是的,但你需要鍵入 – imrichardcole

+1

@RaviKumarMistry在你說只有'String'類型的對象可能被放置在列表中後,當你添加''時。使用這將意味着你不必在任何地方使用強制轉換。 – maffo

相關問題