Java:boolean primitive private方法,即使设置为true也返回false

时间:2014-10-22 16:02:11

标签: java boolean return primitive

我有一个调用私有方法的公共方法,它有条件地调用另一个私有方法。所有这三个方法都返回一个布尔原始值,但是该值有时会从我预期的值变化。

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

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

编辑:我在底部添加了ACTUAL代码

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永远不会执行(至少我从未在控制台中看到任何内容),并且结果的值(此时为真)返回false 。

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

有人看到我搞砸了吗?

编辑:这是ACTUAL代码 - 替换方法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 
> ***

(我知道我应该首先发布ACTUAL代码)

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

3 个答案:

答案 0 :(得分:1)

我建议你在这一行之前加上一个调试打印语句:

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

由于这是在while循环中,并且即使result已设置为true,也允许该方法返回false。我打赌这是错误回报的来源,以及为什么你没有看到正在执行的最终印刷报表。

答案 1 :(得分:0)

阅读本文:

Is Java "pass-by-reference" or "pass-by-value"?

在这个方法中

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

您重新实例化布尔变量。这是范围方法result

之外的新布尔bar

简单地阻止。试想一下。

            result = true;
            System.out.println("bar: " + result); 

最后看起来像是

private boolean bar(final Object arg0, final Object arg1, final Object arg2) { 
    boolean result = false;
    // no reassignee result value
    return result; 
}

所以你返回 false

答案 2 :(得分:0)

final boolean result

这意味着您希望结果在第一个值之后永远不会改变。

这就是你得到的。 删除最终。