2011-02-15 44 views
1

我正在使用jtopen/jt400工具包從Java調用IBM i系列r5v4(又名AS/400)上的程序(實際上:JRuby,但我見過純Java中的相同問題)。這對一些程序來說工作得很好,而對於其他程序,輸出字節包含所有的零,這只是錯誤的,有時甚至是無效的(例如在ZonedDecimal的情況下)。沒有消息附加到ProgramCall,JobList或SYSOPR.MSGQ中。有誰知道爲什麼發生這種情況?從Java調用i系列程序產生無效輸出

表現出一定的代碼(我敢肯定,任何人都已經與圖書館合作可以瞭解此Java紅寶石渲染):

as400 = AS400.new(host, user, password) 
call = ProgramCall.new(as400) 
call.program = "/QSYS.LIB/LIBRARY_NAME.LIB/PROGRAM_NAME.PGM" 

# Prepare converters 
text1_converter = AS400Text.new(1) 
text3_converter = AS400Text.new(3) 
decimal92_converter = AS400ZonedDecimal.new(11, 2) 

# Prepare parameters 
call.parameter_list = [] 

# Input parameters 
call.parameter_list << ProgramParameter.new(text1_converter.to_bytes('N')) 
call.parameter_list << ProgramParameter.new(decimal92_converter.to_bytes(1500.25)) 

# Output parameters 
call.parameter_list << ProgramParameter.new(text3_converter.byte_length) 
call.parameter_list << ProgramParameter.new(decimal92_converter.byte_length) 

# Execute the call  
call.run 

# Show the results 
puts "Text3 output value: " + text3_converter.to_object(params[2].output_data).to_s 
puts "Decimal92 output value: " + decimal92_converter.to_object(params[3].output_data).to_s 

正如我所說,這只是正常的一些程序,而對於其他人,params[2].output_data將是一個[0,0,0]的字節數組,這不是預期的結果。更糟糕的是,params[3].output_data將會是[0,0,0,0,0,0,0,0,0,0],它們是ZonedDecimal.new(9,2)的無效字節值。誰能幫我嗎?

回答

3

原來你必須總是設置輸出參數有效input_data,即使這些值沒有在任何地方使用。如果你不這樣做,它們將不會被初始化,並且它們將包含垃圾(但在我的情況下,通常內存位置將包含零)。如果程序隨後沒有明確設置輸出值,這恰好就是我選擇輸入參數的情況,那麼這個格式垃圾進入等於垃圾進出成立。

當然,防禦性編程建議程序員初始化這些值或確保它們設置在可以通過代碼獲取的每條路徑中,這將防止首先出現此問題。但是,似乎合同總是在輸出參數上設置值,所以我錯誤地使用了API。