Java: boolean 原始私有(private)方法返回 false,即使设置为 true

标签 java boolean return primitive

我有一个公共(public)方法,它调用一个私有(private)方法,该方法有条件地调用另一个私有(private)方法。所有三个方法都返回一个 boolean 原始值,但是该值有时会与我期望的不同。

我确信我错过了一些非常明显的东西,但我现在太接近代码而无法看到问题。

这是代码的清理示例版本以及我看到的结果:

编辑:我已在底部添加实际代码

public class MyClass { 

    // Default Constructor
    public MyClass() {}

    public boolean foo(final Object arg0, final Object arg1, final Object arg2) { 
        final boolean result = this.bar(arg0, arg1, arg2); 
        System.out.println("foo: " + result);
        return result;
    } 


    private boolean bar(final Object arg0, final Object arg1, final Object arg2) { 
        boolean result = false;
        System.out.println("bar: " + result); 

        try {  
            // complicated code that could generate an exception

            if (this.wowsers(arg0, arg1, arg2)) {
                result = true;
                System.out.println("bar: " + result); 
                System.out.println("bar: call to wowsers() returned true"); 
            }

        } catch (Exception e) { 
            System.out.println("SOMETHING BLEW UP");
            e.printStackTrace();
        } finally { 
            // This should NOT change result
            this.irrelevantMethod_1(null);
            this.irrelevantMethod_2(null);
            this.irrelevantMethod_3(null);
        } 

        System.out.println("bar: " + result); 
        return result;
    } 

    private boolean wowsers(final Object arg0, final Object arg1, final Object arg2) { 
        boolean result = false;

        // complicated code involving the passed in arguments
        // this MIGHT change result

        System.out.println("wowsers: " + result); 
        return result;
    }

    private void irrelevantMethod_1(Object arg0) { 
        // Nothing in here to change result 
    } 

    private void irrelevantMethod_2(Object arg0) { 
        // Nothing in here to change result 
    } 

    private void irrelevantMethod_3(Object arg0) { 
        // Nothing in here to change result 
    } 
} // END Class MyClass

调用代码:

MyClass myInstance = new MyClass(); 
myInstance.foo(); 

控制台输出:

> bar: false
> wowsers: true 
> bar: true
> bar: call to wowsers() returned true 
> foo: false

在上面的示例中,结果的值在方法 dowsers() 中设置为 true,并正确返回到 bar()。当 bar() 测试 wowsers() 返回的值并发现它为 true 时,它​​将自己的结果设置为 true 并将结果值打印到控制台,并打印 dowsers() 返回 true 。

bar() 末尾的 System.out.println 永远不会执行(至少我从未在控制台中看到任何内容),并且 result 的值(此时为 true)返回为 false。

然后 foo() 方法打印从调用 bar 中收到的值,该值始终为 false。

有人看出我哪里搞砸了吗?

编辑:这是实际代码 - 替换方法 foo() 和 bar()

public boolean sendReminderNotifcation(final RequestController controller, final Session session, final Request request,
        final Comment comment, final boolean treatAsNewNote) {

    final boolean result = this.sendNotification(controller, session, request, comment, null, MailType.Remind, treatAsNewNote);
    System.out.println("sendReminderNotifcation(): " + result);
    System.out.println("***");
    return result;
}



private boolean sendNotification(final RequestController controller, final Session session, final Request request,
        final Comment comment, final TreeSet<String> copyto, final MailType mailtype, final boolean treatAsNewNote) {

    HashMap<NotifyWhom, TreeSet<String>> sendTo = null;
    boolean result = false;

    System.out.println("sendNotification(): " + result);

    try {
        if (null == controller) { throw new IllegalArgumentException("RequestContoller is null"); }

        this.setRequestURLprefix(controller.getRequestURLprefix());

        if (null == session) { throw new IllegalArgumentException("Session is null"); }
        if (null == request) { throw new IllegalArgumentException("Request is null"); }
        if (null == mailtype) { throw new IllegalArgumentException("mailtype is null"); }

        final EnumSet<NotifyWhom> recipients = this.getRecipients(controller, session, request, mailtype, treatAsNewNote);

        if ((null == recipients) || recipients.isEmpty()) { return false; }

        final HashMap<NotifyWhom, TreeSet<String>> tempSendTo = this.getSendTo(controller, request, recipients);
        if (null == tempSendTo) { throw new RuntimeException("NO RECIPIENTS FOR NOTIFICATION"); }

        // clear out any duplicates
        sendTo = this.purgeDuplicateRecpients(tempSendTo);

        // Update Prior Assignee Information
        // Update Requestor Information
        // Update Queue Owner Information
        this.updateReOpenedInformation(controller, session, request);

        final String subject = (request.isReOpened()) ? HelpdeskNotifications.SUBJECT_REOPENED : HelpdeskNotifications.SUBJECT_UPDATED;

        final Iterator<Entry<NotifyWhom, TreeSet<String>>> sit = sendTo.entrySet().iterator();
        final TreeSet<NameHandle> exclude = this.getExcludeRecipients();
        while (sit.hasNext()) {
            final Map.Entry<NotifyWhom, TreeSet<String>> entry = sit.next();
            final MailNotifyKey key = new MailNotifyKey(this.getLogger(), mailtype, entry.getKey());
            if (MailType.Remind.equals(mailtype)) {
                final Status status = request.getStatus();
                final MailRecipientOption mro = (null == status) ? null : status.getMailRecipientOption(key);

                // A null mro indicates that Notifications are DISABLED
                if (null == mro) { return false; }
            }

            final TreeSet<String> sendto = entry.getValue();
            if (this.sendEmail(controller, session, request, subject, comment, sendto, copyto, exclude, key, treatAsNewNote)) {
                result = true;
                System.out.println("sendNotification(): " + result);
                System.out.println("sendNotification(): (call to sendEmail() returned true)");
            }
        }

        // Send Special Re-Opened Notifications
        if (this.sendReOpenedNotifications(controller, session, request, subject, comment, treatAsNewNote)) {
            result = true;
            System.out.println("sendNotification(): " + result);
            System.out.println("sendNotification(): (call to sendReOpenedNotifications() returned true)");
        }

    } catch (final Exception e) {
        this.getLogger().logException(this, e);
        e.printStackTrace();
    } finally {
        this.setPriorAssigneeNotify(null);
        this.setReOpenedRecipients(null);
        this.setExcludeRecipients(null);
    }

    System.out.println("sendNotification(): " + result);
    return result;
}

我得到的控制台输出是:

> sendNotification(): false 
> sendNotification(): true 
> sendNotification(): (call to sendEmail() returned true) 
> sendReminderNotifcation(): false 
> ***

(我意识到我应该首先发布实际代码)

出于某种原因,我无法弄清楚,方法 bar() 和方法 sendNotification() 中的最后两行代码似乎没有运行。是否还有其他我不知道的方法可以完成并返回?

最佳答案

我建议您在此行之前放置调试打印语句:

              if (null == mro) { return false; }

因为这是一个 while 循环,并且允许该方法返回 false,即使 result 已设置为 true。我敢打赌这就是错误返回的来源,以及为什么您看不到正在执行的最终打印语句。

关于Java: boolean 原始私有(private)方法返回 false,即使设置为 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26511892/

相关文章:

C if 语句无法检测新行

python - 如何在函数中返回可选参数

java - 在 Java 中使用 Minim 库。无法让助手类工作

java - 使用 Java 将模拟的 Windows 键盘事件发送到使用 SDL 的 C 程序

c - 为什么 sizeof(a ? true : false, a) 运算符打印一个字节?

c - return 1 和 return 0 有什么不同?回溯在给定代码中如何工作?

java - 为什么这会返回 false?

c - 在 C 错误消息中返回结构体数据类型

java - 对于无效的 LocalDate 日期抛出错误

java - 未调用 Jersey ExceptionMapper