【问题标题】:Hashtable returns null in JAVAHashtable 在 JAVA 中返回 null
【发布时间】:2014-06-18 16:30:46
【问题描述】:

我正在尝试将一些键值对输入到哈希表中,对数据进行编码,然后在单独的 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

【问题讨论】:

  • 首先检查来自:Util.hex2ByteArray(result)(可能是null 或空字节数组)的返回值。
  • 不,正如我所说,我已经检查了它返回的值。它给出了一个字节数组。准确地说,它给出了 [B@42009068
  • @Deathstroke - 你检查过数组的长度了吗???
  • 1.什么是空? hashtable 还是 hashtable.get(somekey)? 2、你试过调试吗?
  • 向我们展示运行时错误的堆栈跟踪。

标签: java hashtable


【解决方案1】:

这种读取字节数组的方式非常笨拙且容易出错,但如果您坚持这样做,您至少应该检查在执行任何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

【讨论】:

  • 我不认为是这种情况 - 从例外情况来看,他似乎从读取 bytearray 获得了 EOF
  • 嗯...会使用 int 而不是 short 来修复错误吗?
  • @Deathstroke 不是您提供的 result 字符串。你从哪里得到那个字符串,为什么你试图将它作为十六进制读取到字节数组?
  • 此字符串包含各种参数,如姓名、年龄、电话号码和图像。输入的字符串是正确的。我将它作为 Hex to Byte-Array 读取,因为 decode() 函数将字节数组作为参数。
  • @alfasin。我发现了错误。事实证明,图像参数的键值对搞砸了。除了上述参数,即姓名血型、性别等。我还传递了一张图片。我打印了所有键的 oStream.readShort() 值。它给出了 eack 键的所有值的长度。即“B+”为 2,“987676666”为 9,依此类推。对于图像,它给出了 8354。当我使用小于 1KB 的图像时,它的 oStream.readShort() 的值给出了 1238,并且它工作得很好。
猜你喜欢
  • 2016-11-25
  • 2012-03-26
  • 2015-11-04
  • 1970-01-01
  • 2020-03-27
  • 2015-06-04
  • 2019-08-25
  • 2016-05-28
  • 2016-03-08
相关资源
最近更新 更多