2017-05-19 4 views
-1

私はこのフォーラムで以前に作成された投稿を読んだ(信じている)と思います。リファレンス/値によるJavaのパス

しかしJavaの初心者として、私はMAPのvoucherDetailsを作成し、(トレースで確認)、それが移入されている関数に渡す問題

を持っています。帰りに私は空です。どうして?

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

エフライム

+2

役立ちます

ホープ[MCVE]を提供してください。 –

+0

'handleVoucherDetailsResponse'のコードなしで言うのは難しいでしょう... – AntonH

+0

これはフォーラムではありません。 – slim

答えて

2

voucher=decodeVoucherDetailsResponse(response);呼び出し側の参照を更新しません。新しいMapを返さずに、発信者の参照を更新することはできません。ただし、2番目のMapからすべてのキーと値のペアを最初のものに追加できます。あなたにも、既存のすべての値を削除する場合と同様に、

voucher.putAll(decodeVoucherDetailsResponse(response)); 

putAll()voucher.clear();を呼び出します。ここで

+0

したがって、voucher = decodeVoucherDetailsResponse(レスポンス)とは何ですか?実際には?誤ったデバッグを示すように地図を更新したようです。何が更新されましたか? – Ephraim

+0

'handleVoucherDetailsResponse'の* local *参照で、' handleVoucherDetailsResponse'に渡される参照ではありません。 Javaは**常に**値渡しであり、元の呼び出し元の値を更新することはできません( 'decodeVoucherDetailsResponse'で行ったように、戻り値と代入なしで)。 –

0

は、javaがどのように動作するかです:
などすべてのあなたの整数、文字、変数はちょうど飛行機が変数が参照ここ

ある
あなたのすべてのオブジェクトを値です。

voucher=decodeVoucherDetailsResponse(response); 

機能でhandleVoucherDetailsResponse()あなたをvoucher変数をdecodeVoucherDetailsResponse()によって返された新しいオブジェクトの参照に設定します。
関数内で参照されている
(空)関数の外側で参照される1つの、別の(データHAS)

それはにあるあなたがすべき方法:

は、だから今、あなたは、2つのオブジェクトを持っています変数にvoucher変数を渡します。関数に変数が設定されます。

マップがまだ空の場合、decodeVoucherDetailsResponse()機能に問題があります。これはあなたが、
-Mkキロ

関連する問題