-1

我已经阅读并(相信我已经)理解了之前在这个论坛上发布的帖子。

但是,作为 Java 新手,我遇到了问题

我创建了一个 MAP 凭证详细信息并将其传递给一个正在填充它的函数(通过跟踪验证)。返回时 iy 为空。为什么?

Map<String, Object> voucherDetails=new LinkedHashMap<>();
log.info("B4: "+voucherDetails.size());   // size is 0  
log.info("B4: "+voucherDetails.toString());     // {}
if (!ws.handleVoucherDetailsResponse(voucherDetails)){
    return false;
}
log.info("AF: "+voucherDetails.toString()); //{}
log.info("AF: "+voucherDetails.size());     // size is 0


public boolean handleVoucherDetailsResponse(Map<String, Object> voucher) throws IOException {
    log.enter("handleDetailsDetailsResponse");

    PCVMResponseType status=decodeResponse();
    switch (status) {       
    case DATA:
        voucher=decodeVoucherDetailsResponse(response);
        String accountno=(String)voucher.get("accountno");
        log.info("AA: "+accountno);
        String voucherno=(String)voucher.get("voucherno");
        log.info("VV: "+voucherno);         
        log.info("CC: "+voucher.size());
        log.info("IN: "+voucher.toString());            
        return true;
    default:
        return false;           
    }       
}

尽管在函数内部填充了凭证,但返回时仍然是空的。好像对象不是作为指向它的指针传递的。

我做错了什么以及如何正确做

TIA

以法莲

4

2 回答 2

2

voucher=decodeVoucherDetailsResponse(response);不更新调用者的参考。您不能在不返回新的Map. 但是,您可以将所有键值对从第二个Map添加到第一个。喜欢,

voucher.putAll(decodeVoucherDetailsResponse(response));

如果您还想删除所有现有值,请调用voucher.clear();before putAll()

于 2017-05-19T16:18:54.427 回答
0

以下是 java 的工作原理:
所有整数、字符等变量都只是平面值
所有对象变量都是引用

这里:

voucher=decodeVoucherDetailsResponse(response);

在函数中 handleVoucherDetailsResponse() ,您将voucher变量设置为由 . 返回的新对象的引用decodeVoucherDetailsResponse()

所以现在你有两个对象:
一个在函数外部引用(空)
,另一个在函数内部引用(有数据)

您应该这样做的方法是将voucher变量传递给函数,该函数将填充它。

如果 Map 仍然为空,则说明decodeVoucherDetailsResponse()功能存在问题。

希望这对你有帮助,
-Mk Km

于 2017-05-19T16:30:23.110 回答