繁体   English   中英

哈希表在JAVA中返回null

[英]Hashtable returns null in JAVA

我正在尝试将一些键值对输入到哈希表中,对数据进行编码,然后在单独的android活动中进行解码。 但是,当我尝试获取值时,哈希表返回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;
    }
}

问题不在输入字符串中,而是从十六进制到字节数组的转换。 我解码字节数组的行上发生运行时错误。

哈希表htParams = new MobileEncoderDecoder()。decode(Util.hex2ByteArray(result));

我如何解决它?

编辑-这是我的日志

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 android.app.Activity.performCreate(Activity.java:5248)
06-18 12:53:42.580: W/System.err(15627):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
06-18 12:53:42.581: W/System.err(15627):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
06-18 12:53:42.581: W/System.err(15627):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
06-18 12:53:42.581: W/System.err(15627):    at android.app.ActivityThread.access$800(ActivityThread.java:139)
06-18 12:53:42.581: W/System.err(15627):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
06-18 12:53:42.581: W/System.err(15627):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-18 12:53:42.581: W/System.err(15627):    at android.os.Looper.loop(Looper.java:136)
06-18 12:53:42.581: W/System.err(15627):    at android.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.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-18 12:53:42.583: W/System.err(15627):    at com.android.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 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.app.ActivityThread.access$800(ActivityThread.java:139)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.os.Looper.loop(Looper.java:136)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.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.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at com.android.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 android.app.Activity.performCreate(Activity.java:5248)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
06-18 12:53:42.588: E/AndroidRuntime(15627):    at android.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

这种读取字节数组的方式非常容易出错,但是如果您坚持要这样做,那么您至少应该做的就是检查在执行任何read()之前是否有足够的字节可以读取。

由于您只读取short字节(2个字节),因此应在每次读取之前检查流中至少有两个字节:

public static Hashtable decode(byte[] byData) throws Exception
{        
    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++)
        {
            if(oStream.available() < 2)
                break;
            int len = oStream.readShort();
            byte[] byParam = new byte[len];
            if(oStream.available() <2)
                break;
            oStream.read(byParam);
            if(oStream.available() <2)
                break;
            int iValueLen = oStream.readShort();
            byte[] byValue = null;

            if(iValueLen > 0)
            {
                byValue = new byte[iValueLen];
                if(oStream.available() < 2)
                    break;
                oStream.read(byValue);
            }

            if(byValue != null)

                htParams.put(new String(byParam), new String(byValue));
        }

        return htParams;
    }catch(Exception ex)
    {
        ex.printStackTrace();
        System.out.println(ex.getMessage());
        throw ex;
    }
}

我得到的输出是:

i = b; val: B+
i = m; val: 987676666
i = l; val: Singh
i = s; val: Male
i = f; val: Rahul

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM