Проблема с коротким примитивным типом Java - PullRequest
0 голосов
/ 08 сентября 2011

Я создаю приложение, которое требует соединения с сервером методом post и получает результат.Мне нужно получить определенную часть ответа сервера и преобразовать ее в различные типы примитивов (от String до short, int, byte и т. Д.)

Так что в основном мне нужнополучить часть кода ответа и преобразовать его в короткий, чем посмотреть, есть ли элемент enum с этим значением. Но проблема в том, что ответ возвращает значение 001, и после того, как я преобразовал его в короткий и передал егомой getByValue(int) метод в enum, он говорит мне, что нет элемента с 001. Если я печатаю значение short, я получаю 1.

Вот пример кода, который я 'используя:

                httppost.setEntity(new UrlEncodedFormEntity(postParameters));

            HttpResponse response = httpclient.execute(httppost);
            Log.v("Response ","Status line : "+ response.getStatusLine().toString());
            String responseBody = EntityUtils.toString(response.getEntity()); //response
            Log.v("Response ","Response : "+ responseBody);

            int objectIdentificator = Integer.parseInt(responseBody.substring(0,32));
            Log.v("Response ","Object Identificator (LONGINT) : "+ responseBody.substring(0,32));
            Log.v("Response ","Object Identificator (LONGINT) : "+ objectIdentificator);

            String type = responseBody.substring(32,35);
            Log.v("Response ","TYPE (UNSIGNED BYTE) : "+ type);
            short pType = Short.parseShort(type); // short 
            Log.v("Response ","TYPE (UNSIGNED BYTE) : "+ pType);

            String operation = responseBody.substring(35,38); //
            short operationType = Short.parseShort(operation);
            Log.v("Response ","OPERATION (UNSIGNED BYTE) : "+ operation);
            Log.v("Response ","OPERATION (UNSIGNED BYTE) : "+ operationType);

            String objectId = responseBody.substring(38, 70);
            Log.v("Response ","UID (CHAR, length 32) : "+ objectId);

            int id = Integer.parseInt(responseBody.substring(70, 102));
            Log.v("Response ","ID (LONGINT) : "+ responseBody.substring(70, 102));
            Log.v("Response ","ID (LONGINT) : "+ id);

            String size = responseBody.substring(102,134);          
            Log.v("Response ","Data Size (LONGINT) : "+ size);

            String hash = responseBody.substring(134,166);
            Log.v("Response ","Data Hash (CHAR, length 32 : "+ hash);

            String  dType = responseBody.substring(166,169);
            Log.v("Response ","Data Type (UNSIGNED BYTE) : "+ dType);
            short dataType = Short.parseShort(dType);
            Log.v("Response ","Data Type (UNSIGNED BYTE) : "+ dataType);

            String data = responseBody.substring(169, responseBody.length());
            Log.v("Response ","Data (CHAR, any length, in BASE64) : "+ data);

            byte[] first = Base64.decode(data);
            String string = new String(first, "UTF-8");

            Log.v("Response ","BASE 64 : "+ string);


            RPCPacket packet = new RPCPacket(   objectIdentificator,
                                                RPCPacketType.getPacketTypeByValue(pType),
                                                RPCOperationType.getByValue(Integer.parseInt(operation)),
                                                objectId,
                                                id,
                                                Integer.parseInt(size),
                                                hash,
                                                RPCPacketDataType.getByValue(dataType),
                                                first
                                                );


            Log.v("PacketType", "RPCPacketType : "+packet.packetTypeToStr(RPCPacketType.getPacketTypeByValue(pType)));

И код packetTypeToStr:

public String packetTypeToStr(RPCPacketType type){

        String str=null;
        switch(type){
        case ST_OBJECT_TYPE_INFO_START: 
                str = "ST_OBJECT_TYPE_INFO_START"; 
            break;
        case ST_OBJECT_TYPE_INFO_ERROR: 
                str = "ST_OBJECT_TYPE_INFO_ERROR"; 
            break;
        case ST_OBJECT_TYPE_COLLECTION: 
                str = "ST_OBJECT_TYPE_COLLECTION"; 
            break;
        case ST_OBJECT_TYPE_CATEGORY: 
                str = "ST_OBJECT_TYPE_CATEGORY";
            break;
        case ST_OBJECT_TYPE_CARD: 
                str = "ST_OBJECT_TYPE_CARD"; 
            break;
        case ST_OBJECT_TYPE_MESSAGE: 
                str = "ST_OBJECT_TYPE_MESSAGE"; 
            break;
        case ST_OBJECT_TYPE_GENRE: 
                str = "ST_OBJECT_TYPE_GENRE"; 
            break;
        case ST_OBJECT_TYPE_TAG: 
                str = "ST_OBJECT_TYPE_TAG"; 
            break;
        case ST_OBJECT_TYPE_USER: 
                str = "ST_OBJECT_TYPE_USER"; 
            break;
        case ST_OBJECT_TYPE_MEDIA_COLLECTION: 
                str = "ST_OBJECT_TYPE_MEDIA_COLLECTION"; 
            break;
        case ST_OBJECT_TYPE_MEDIA_CATEGORY: 
                str = "ST_OBJECT_TYPE_MEDIA_CATEGORY"; 
            break;
        case ST_OBJECT_TYPE_MEDIA_CARD: 
                str = "ST_OBJECT_TYPE_MEDIA_CARD"; 
            break;
        case ST_OBJECT_TYPE_MEDIA_TAG: 
                str = "ST_OBJECT_TYPE_MEDIA_TAG"; 
            break;
        case ST_OBJECT_TYPE_INFO_END: 
                str = "ST_OBJECT_TYPE_INFO_END"; 
            break;
        case ST_OBJECT_TYPE_CARDSTATS_CATEGORY: 
                str = "ST_OBJECT_TYPE_CARDSTATS_CATEGORY"; 
            break;
        case ST_OBJECT_TYPE_CONTENT: 
                str = "ST_OBJECT_TYPE_CONTENT"; 
            break;
        case ST_OBJECT_TYPE_MEDIA_COLLECTION_BUTTON: 
                str = "ST_OBJECT_TYPE_MEDIA_COLLECTION_BUTTON"; 
            break;
        default: 
                str ="UNKNOWN "+type;
            break;
        }

        return str;
    }

И исключение:

09-08 09:53:08.744: WARN/System.err(2509): java.lang.IllegalArgumentException: no datatype with 001 exists
09-08 09:53:08.754: WARN/System.err(2509):     at com.stampii.stampii.comm.rpc.RPCCommucatorDefines$RPCOperationType.getByValue(RPCCommucatorDefines.java:34)
09-08 09:53:08.754: WARN/System.err(2509):     at com.stampii.stampii.user.UserLogin$2.onClick(UserLogin.java:122)
09-08 09:53:08.754: WARN/System.err(2509):     at android.view.View.performClick(View.java:2408)
09-08 09:53:08.754: WARN/System.err(2509):     at android.view.View$PerformClick.run(View.java:8817)
09-08 09:53:08.754: WARN/System.err(2509):     at android.os.Handler.handleCallback(Handler.java:587)
09-08 09:53:08.754: WARN/System.err(2509):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-08 09:53:08.754: WARN/System.err(2509):     at android.os.Looper.loop(Looper.java:144)
09-08 09:53:08.754: WARN/System.err(2509):     at android.app.ActivityThread.main(ActivityThread.java:4937)
09-08 09:53:08.754: WARN/System.err(2509):     at java.lang.reflect.Method.invokeNative(Native Method)
09-08 09:53:08.754: WARN/System.err(2509):     at java.lang.reflect.Method.invoke(Method.java:521)
09-08 09:53:08.754: WARN/System.err(2509):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-08 09:53:08.764: WARN/System.err(2509):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-08 09:53:08.764: WARN/System.err(2509):     at dalvik.system.NativeStart.main(Native Method)

Код RPCOperationType:

public enum RPCOperationType {
        O_CREATE(1),
        O_UPDATE(2),
        O_DELETE(3);

        private int value;
        private intvalue1;
        private RPCOperationType(int i){
            this.value=i;
        }
        public int getNumericType(){
            return value;
        }
        public static RPCOperationType getByValue(int i) {
             for(RPCOperationType dt : RPCOperationType.values()) {
                 if(dt.value1 == i) {
                     return dt;
                 }
             }
             throw new IllegalArgumentException("no datatype with " + i + " exists");
         }

    }

Таким образом, какие-либо предложения, как я могу решить эту проблему, не меняя идентификаторы в enum?Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Исключением не является код, который вы нам показали.Трассировка стека указывает, где происходит исключение:

at com.stampii.stampii.comm.rpc.RPCCommucatorDefines$RPCOperationType.getByValue(RPCCommucatorDefines.java:34)

Таким образом, вызов RPCOperationType.getByValue() в RPCCommucatorDefines.java в строке 34 вызывает это исключение.Вы, безусловно, передаете ему String, а не int, кстати, потому что нет никакой возможности для печати короткой переменной как 001, как это сделано в сообщении об ошибке исключения.

две первые строки трассировки стека являются наиболее важными.В первом сообщается, что не так, а во второй строке указывается, куда выдается исключение.

0 голосов
/ 08 сентября 2011

Если вам нужно дополнить число нулями, вам придется использовать Formatter .

...