我正在研究一个需要非常基本的登录功能的学校项目(没什么太奇特的,看看密码将如何保留为纯文本)。我有一个测试数据库,并已经过彻底测试,所有正在引用和从数据库中提取的值也可以正确显示。您将在代码中看到,要比较的每个变量的类型都是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();
}
}
答案 0 :(得分:2)
答案 1 :(得分:2)
除了像1
之类的原语之外,你必须将值与java中的equals()
方法进行比较。
因此,在您的代码中,这意味着:userOut.equals(un)
。
最后你会得到:
if (userOut.equals(un)) {
System.out.println("Welcome " + un + "!");
}
如果有机会,您应该将已知的String
与输入进行比较,因为您可以避免使用NullPointerException
。
一个常见问题:
public void someMethod(String someParameter) {
if(someParameter.equals(MY_CONSTANT)) {
// ...
}
}
这应该重构为:
public void someMethod(String someParameter) {
if(MY_CONSTANT.equals(someParameter)) {
// ...
}
}
答案 2 :(得分:0)
如果您要比较字符串,请尝试使用equals
代替==
您还可以使用equalsIgnoreCase
来避免case sensitive
个问题
答案 3 :(得分:0)
要比较java中的对象,请使用.equals()方法而不是“==”运算符
替换以下代码
if (userOut == un)
到
if (userOut.equals(un))
如果你想忽略下面的案例使用
if (userOut.equalsIgnoreCase(un))
答案 4 :(得分:0)
在Java中使用==
运算符时,您只需查看引用变量是否引用相同的字符串。因此,在您的情况下,这将始终评估为false。
要简单地比较字符串,请尝试userOut.equals(un)
。这将检查字符串的实际内容以查看它们是否相等。如果是,它将返回true。
有关详细信息,请查看:
http://www.thejavageek.com/2013/07/27/string-comparison-with-equals-and-assignment-operator/
答案 5 :(得分:0)
==用于客户端脚本,如javascript或jquery。服务器端需要equals或equalsIgnoreCase。
答案 6 :(得分:0)
这是因为String是一个类,而不是数据类型。你实际上只是将两个类引用相互比较而不是实际的字符串。您必须使用类设计器提供的equal()来比较String的两个实例的内容:
userOut.equals(un)