好吧,我之前从未遇到过这个问题所以我不确定如何说出来或修复它,我正在构建一个创建经销商的java应用程序,在该应用程序中我将参数传递给DealerFactory.createDealer方法,然后首先检查该经销商是否存在条件语句,如下所示:
if (DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId)) {
throw new Exception("Sorry That Dealer Already Exists");
} else if (DealerFactory.fetchDealer(loginId).getId().equals(DNo)){
throw new Exception("Sorry That Dealer Already Exists");
} else {
<< proceed with the rest of the method here >>
我之前已经看过这个,以便检查用户名的可用性和正在创建的人的ID。然而,在运行之后,我发现如果我创建经销商并且条件评估为真,则if语句工作得很好让我知道我创建了一个已经存在的用户并且我需要用新的不同的Id创建他/她用户名。但是,如果条件评估为false,我似乎永远不会进入语句的else部分,我没有错误,没有编译问题,也没有例外我已经用不同的方式写了这个语句来尝试它,这不是真的有什么不同,只是看起来语法不同:
if (DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId)
|| DealerFactory.fetchDealer(loginId).getId().equals(DNo)) {
throw new Exception("Sorry That Dealer Already Exists");
}
我已经包含了println语句来通过它的运行来跟踪程序,当条件求值为false时,我从未进入else语句。我似乎无法弄清楚为什么它在条件陈述中被破坏时被评估为假,有什么想法?
编辑:::
好的,以便我可以帮助你们帮助我们更多的帮助lol这里是完整的方法,我为没有在第一时间发布而道歉
public static int create(String DNo, String name, String admin,
String loginId, String password, String callSrc, String voiSys,
String whoCall, String callBrt, String active, String adfEmail)
throws SQLException, Exception {
int validateResult = 0;
if (DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId)
|| DealerFactory.fetchDealer(loginId).getId().equals(DNo)) {
throw new Exception("Sorry That Dealer Already Exists");
}
try {
DealerFactory.pool = DBConnector.getInstance();
DealerFactory.connect = DBConnector.getConnection();
DealerFactory.preparedStatement = connect
.prepareStatement("Insert Into Dealers (DNo, Dealer, Admin, Login, Password, CallSrc, VoiSys, WhoC, CBrt, Active, ADFemail) "
+ "values(?,?,?,?,?,?,?,?,?,?,?)");
DealerFactory.preparedStatement.setString(1, DNo);
DealerFactory.preparedStatement.setString(2, name);
DealerFactory.preparedStatement.setString(3, admin);
DealerFactory.preparedStatement.setString(4, loginId);
DealerFactory.preparedStatement.setString(5, password);
DealerFactory.preparedStatement.setString(6, callSrc);
DealerFactory.preparedStatement.setString(7, voiSys);
DealerFactory.preparedStatement.setString(8, whoCall);
DealerFactory.preparedStatement.setString(9, callBrt);
DealerFactory.preparedStatement.setString(10, active);
DealerFactory.preparedStatement.setString(11, adfEmail);
validateResult = DealerFactory.preparedStatement
.executeUpdate();
} catch (SQLException ex) {
System.err.println("Error: " + ex + "\n");
ex.printStackTrace();
} finally {
DBUtils.closePrepStatement(DealerFactory.preparedStatement);
DealerFactory.pool.freeConnection(DealerFactory.connect);
}
return validateResult;
}
答案 0 :(得分:2)
首先,由于NullPointerException
所以这一部分:
if(DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId))
看起来像这样:
if(DealerFactory.fetchDealer(loginId) != null &&
DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId))
或者您可以在所有null
语句之前单独进行if
检查。
然而,你所做的是一种矫枉过正。整个部分:
DealerFactory.fetchDealer(loginId).getLoginId()
如果您找不到经销商或null
已经拥有,请返回loginId
。
如果找不到经销商,假设您的fetchDealer()
方法返回null
。
而不是:
if(DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId)))
你可以这样做:
if(DealerFactory.fetchDealer(loginId) != null)
您可以做的另一项改进是向DealerFactory
添加一个名为dealerExists(String id)
的方法,声明如下:
boolean dealerExists(String id) {
return (YOUR_DATA_STRUCTURE_OF_DEALERS.get(id) != null);
}
甚至:
boolean dealerExists(String id) {
return (fetchDealer(loginId) != null);
}
这将允许更好的代码逻辑流程。那么你的if
陈述就会很清楚:
if(DealerFactory.dealerExists(loginId) {
throw new Exception("Sorry That Dealer Already Exists");
}
此外,值DNo
是我假定的经销商编号,您正在检查经销商是否存在所提供的loginId
或提供的DNo
。但是,在您检查时,您要将DNo
与loginId
进行比较,以检查是否存在经销商。 DNo
究竟是什么意思,loginId
不足以确定经销商存在?
如果您确实需要检查DNo
,只需将其添加为我在上面建议的方法中的检查。
答案 1 :(得分:-1)
更多信息重新调整您传递给条件的变量会有很大帮助(例如loginId
和DNo
)。我要做的第一件事是简化if
&amp;的条件。 else if
陈述。
似乎您可以将if
条件更改为if(DealerFactory.fetchDealer(loginId))
并使其工作方式相同,因为如果工厂退回具有您要查找的ID的经销商,则该经销商已存在。根据我对你想要实现的目标的理解,没有必要深入挖掘。还可以尝试使用调试器和监视变量逐步运行这段代码,以查看每行代码的内容。
编辑:
您还可以将表达式移到条件之外并将它们设置为变量。例如:
int dealerId = DealerFactory.fetchDealer(loginId);
if(dealerId != null && dealerId != loginId) {
//<< proceed with the rest of the method here >>
} else {
//<<throw exception>>
}
检查条件中dealerId
是否为空将避免NullPointerException
s,并且在条件之外声明事物将使得手动调试变得更容易。