在JAVA中,哈希表返回null
我正在尝试将一些键值对输入到哈希表中,对数据进行编码,然后在单独的安卓活动中解码。但是,当我尝试获取值时,哈希表返回null
首先,我传递一个十六进制字符串作为输入:
String result="000700016D0009393837363"+
"7363636360001620002422B"+
"00016C000553696E6768000"+
"17300044D616C6500016600"+
"05526168756C00017020A";
接下来,我将对字符串进行如下解码-
System.out.println("hijk...."+Util.hex2ByteArray(result)+"aa "+Util.hex2ByteArray(result).length);
Hashtable<String , String> htParams = new MobileEncoderDecoder().decode(Util.hex2ByteArray(result));
System.out.println(htParams);
System.out.println("lmno...");
其中Util.hex2ByteArray(result)
使用将给定十六进制字符串转换为字节数组的类。问题不在于从十六进制到字节数组的转换,因为我已经打印了字节数组的值,它是正确的
MobileEncoderDecoder()
是一个具有decode()
方法的类,描述如下-
public Hashtable decode(byte[] byData)
{
try
{
Hashtable htParams = new Hashtable();
if(byData == null || byData.length == 0)
return null;
DataInputStream oStream = new DataInputStream(new ByteArrayInputStream(byData));
int iTotalParameters = oStream.readShort();
for(int i=0; i < iTotalParameters; i++)
{
byte[] byParam = new byte[oStream.readShort()];
oStream.read(byParam);
int iValueLen = oStream.readShort();
byte[] byValue = null;
if(iValueLen > 0)
{
byValue = new byte[iValueLen];
oStream.read(byValue);
}
if(byValue != null)
htParams.put(new String(byParam), new String(byValue));
}
return htParams;
}catch(Exception ex)
{
ex.printStackTrace();
return null;
}
}
问题不在于输入字符串,即从十六进制到字节数组的转换。运行时错误发生在解码字节数组的行上。i、 e
Hashtable htParams=新的MobileenCoder()。解码(Util.hex2ByteArray(结果))
我怎么修理它
编辑-这是我的日志
06-18 12:53:29.182: D/OpenGLRenderer(15346): Enabling debug mode 0
06-18 12:53:30.412: I/AndroidRuntime(15346): VM exiting with result code 0, cleanup skipped.
06-18 12:53:35.109: I/Adreno-EGL(15627): <qeglDrvAPI_eglInitialize:385>: EGL 1.4 QUALCOMM build: ()
06-18 12:53:35.109: I/Adreno-EGL(15627): OpenGL ES Shader Compiler Version: E031.24.00.01
06-18 12:53:35.109: I/Adreno-EGL(15627): Build Date: 12/11/13 Wed
06-18 12:53:35.109: I/Adreno-EGL(15627): Local Branch: 8226workspace
06-18 12:53:35.109: I/Adreno-EGL(15627): Remote Branch:
06-18 12:53:35.109: I/Adreno-EGL(15627): Local Patches:
06-18 12:53:35.109: I/Adreno-EGL(15627): Reconstruct Branch:
06-18 12:53:35.136: D/OpenGLRenderer(15627): Enabling debug mode 0
06-18 12:53:36.063: I/System.out(15627): 12345
06-18 12:53:37.336: W/IInputConnectionWrapper(15627): showStatusIcon on inactive InputConnection
06-18 12:53:42.566: I/System.out(15627): abcdef....
06-18 12:53:42.569: I/System.out(15627): hijk....[B@41ff7730aa56
06-18 12:53:42.572: I/System.out(15627): ****Total Parameters : 7
06-18 12:53:42.573: W/System.err(15627): java.io.EOFException
06-18 12:53:42.580: W/System.err(15627): at libcore.io.Streams.readFully(Streams.java:83)
06-18 12:53:42.580: W/System.err(15627): at java.io.DataInputStream.readShort(DataInputStream.java:152)
06-18 12:53:42.580: W/System.err(15627): at com.example.androscan.MobileEncoderDecoder.decode(MobileEncoderDecoder.java:37)
06-18 12:53:42.580: W/System.err(15627): at com.example.androscan.MainActivity2.onCreate(MainActivity2.java:131)
06-18 12:53:42.580: W/System.err(15627): at 安卓.app.Activity.performCreate(Activity.java:5248)
06-18 12:53:42.580: W/System.err(15627): at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
06-18 12:53:42.581: W/System.err(15627): at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
06-18 12:53:42.581: W/System.err(15627): at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
06-18 12:53:42.581: W/System.err(15627): at 安卓.app.ActivityThread.access$800(ActivityThread.java:139)
06-18 12:53:42.581: W/System.err(15627): at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
06-18 12:53:42.581: W/System.err(15627): at 安卓.os.Handler.dispatchMessage(Handler.java:102)
06-18 12:53:42.581: W/System.err(15627): at 安卓.os.Looper.loop(Looper.java:136)
06-18 12:53:42.581: W/System.err(15627): at 安卓.app.ActivityThread.main(ActivityThread.java:5102)
06-18 12:53:42.582: W/System.err(15627): at java.lang.reflect.Method.invokeNative(Native Method)
06-18 12:53:42.582: W/System.err(15627): at java.lang.reflect.Method.invoke(Method.java:515)
06-18 12:53:42.582: W/System.err(15627): at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-18 12:53:42.583: W/System.err(15627): at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-18 12:53:42.584: W/System.err(15627): at dalvik.system.NativeStart.main(Native Method)
06-18 12:53:42.584: I/System.out(15627): null
06-18 12:53:42.584: I/System.out(15627): lmno...
06-18 12:53:42.584: D/AndroidRuntime(15627): Shutting down VM
06-18 12:53:42.584: W/dalvikvm(15627): threadid=1: thread exiting with uncaught exception (group=0x416e4d40)
06-18 12:53:42.588: E/AndroidRuntime(15627): FATAL EXCEPTION: main
06-18 12:53:42.588: E/AndroidRuntime(15627): Process: com.example.androscan, PID: 15627
06-18 12:53:42.588: E/AndroidRuntime(15627): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androscan/com.example.androscan.MainActivity2}: java.lang.NullPointerException
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.ActivityThread.access$800(ActivityThread.java:139)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.os.Handler.dispatchMessage(Handler.java:102)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.os.Looper.loop(Looper.java:136)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.ActivityThread.main(ActivityThread.java:5102)
06-18 12:53:42.588: E/AndroidRuntime(15627): at java.lang.reflect.Method.invokeNative(Native Method)
06-18 12:53:42.588: E/AndroidRuntime(15627): at java.lang.reflect.Method.invoke(Method.java:515)
06-18 12:53:42.588: E/AndroidRuntime(15627): at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-18 12:53:42.588: E/AndroidRuntime(15627): at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-18 12:53:42.588: E/AndroidRuntime(15627): at dalvik.system.NativeStart.main(Native Method)
06-18 12:53:42.588: E/AndroidRuntime(15627): Caused by: java.lang.NullPointerException
06-18 12:53:42.588: E/AndroidRuntime(15627): at com.example.androscan.MainActivity2.onCreate(MainActivity2.java:134)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.Activity.performCreate(Activity.java:5248)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
06-18 12:53:42.588: E/AndroidRuntime(15627): at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
06-18 12:53:42.588: E/AndroidRuntime(15627): ... 11 more
06-18 12:53:44.447: I/Process(15627): Sending signal. PID: 15627 SIG: 9
# 1 楼答案
这种读取字节数组的方法非常粗糙而且容易出错,但是如果您坚持这样做,那么您至少应该在执行任何
read()
之前检查是否有足够的字节可以读取由于您只读取
short
(2个字节),因此在每次读取之前,应检查流中是否至少有两个字节:我得到的结果是: