有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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) 个答案

  1. # 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