【问题标题】:Why isn't my java code proceeding past my if statements?为什么我的 java 代码没有通过我的 if 语句?
【发布时间】:2014-11-13 00:09:19
【问题描述】:

好的,我以前从来没有遇到过这个问题,所以我不知道如何措辞或修复它,我正在构建一个创建经销商的 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 来创建他/她和用户名。但是,如果条件评估为假,我似乎永远不会将其放入语句的 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 语句中。我似乎无法弄清楚为什么当它被评估为假时它会破坏条件语句,有什么想法吗?

编辑:::

好的,这样我就可以帮助你们帮助我,哈哈,这里是完整的方法,我很抱歉没有首先发布它

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;
}

【问题讨论】:

  • 如果经销商不存在,DealerFactory.fetchDealer(loginId) 不会返回null?如果不是,它返回什么?
  • @JonathanDrapeau 是的,它会返回null,但是如果它为null,那不会因为它不等于当前输入而将它推到下一个语句吗?如果我错了,我会处理 null,但我以前从未处理过它,所以我不确定
  • DNo是什么类型,包含什么内容?
  • 不,它不会,它会抛出一个NullPointerException,正如 nem 在他的回答中所说的那样。
  • @RichardDavy 不,如果您在null 上致电.getLoginId(),则不会。

标签: java performance debugging methods conditional-statements


【解决方案1】:

更多信息将您传递给条件的变量重新分级会有很大帮助(即loginIdDNo)。我要做的第一件事是简化ifelse 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 是否为null 可以避免NullPointerExceptions,而在条件之外声明内容将使手动调试更容易。

【讨论】:

  • 我刚刚从原始版本编辑了帖子,我很抱歉一开始没有这样做,我提供的信息有点缺乏
【解决方案2】:

首先,由于NullPointerException 的危险,您不应该链接这样的方法

所以这部分:

if(DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId))

可能看起来像这样:

if(DealerFactory.fetchDealer(loginId) != null && 
   DealerFactory.fetchDealer(loginId).getLoginId().equals(loginId))

或者您可以在所有if 语句之前单独检查null

但是,您正在做的是矫枉过正。这整个部分:

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 的经销商。但是,在您的检查中,您将DNologinId 进行比较以检查是否存在经销商。 DNo 到底有什么意义,loginId 不应该足以确定经销商存在吗? 如果您确实还需要检查DNo,只需将其添加为我上面建议的方法中的检查即可。

【讨论】:

  • 我不知道为什么我没有以这种方式想到这一点,为什么我直接寻找他们的 id 和登录对我来说是有意义的,但这更有意义并减少了很多代码这是不必要的,非常感谢我的朋友。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多