Java短原语类型问题
我正在构建一个应用程序,它需要使用post方法连接服务器,并获得结果。我需要获取服务器响应的特定部分,并将其转换为不同类型的原语(从Java短原语类型问题,java,android,enums,short,Java,Android,Enums,Short,我正在构建一个应用程序,它需要使用post方法连接服务器,并获得结果。我需要获取服务器响应的特定部分,并将其转换为不同类型的原语(从String到short,int,byte等) 因此,基本上我需要获取响应代码的一部分并将其转换为short,然后查看是否存在具有此值的enum元素。但问题是响应返回值001,在我将其转换为short并将其传递给enum中的getByValue(int)方法之后,它告诉我没有001的元素。如果我打印short值,我会得到1 下面是我正在使用的代码示例:
String
到short
,int
,byte
等)
因此,基本上我需要获取响应代码的一部分并将其转换为short,然后查看是否存在具有此值的enum
元素。但问题是响应返回值001
,在我将其转换为short并将其传递给enum
中的getByValue(int)
方法之后,它告诉我没有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)
RPC类型代码:
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");
}
}
那么,有什么建议可以在不更改枚举中的id的情况下解决此问题?
提前谢谢 您向我们展示的代码不会引发异常。堆栈跟踪显示异常发生的位置:
at com.stampii.stampii.comm.rpc.RPCCommucatorDefines$RPCOperationType.getByValue(RPCCommucatorDefines.java:34)
因此,在第34行对RPCCommucatorDefines.java
中的rpcopeOptionType.getByValue()
的调用引发了此异常。当然,您传递的是一个字符串,而不是int,顺便说一句,因为不能像在异常的错误消息中那样将短变量打印为001
堆栈跟踪的前两行是最重要的一行。第一行告诉您出了什么问题,第二行告诉您异常抛出的位置。如果需要用零填充数字,您必须使用您没有向我们展示任何有关枚举的信息,例如如何根据ID找到枚举值。在我看来,这是重要的一点……您是说抛出了
IllegalArgumentException
?是否抛出消息“不存在具有001的数据类型”?这不太有道理,因为INT不会以这种方式打印。你能准确地告诉我们你看到了什么吗?你是如何将pType传递给getByValue的?qstion更新了更多信息如果你解析字符串,显然00将被删除,因为它们根本不会改变值。您需要将其保留为字符串。getByValue方法中引发的异常与问题中显示的异常完全相同。否。如前所述,阅读堆栈跟踪,并向我们展示rpcopeOptionType.getByValue方法的代码,该方法位于RPCCommucatorDefines.java的第34行。这段代码不可能与您向我们展示的代码相同。我在getByValue中看到,我采用字符串类型,而不是int。因此,我将其编辑为字符串,现在错误为“不存在带1的数据类型”。如果您向我们展示枚举的真实代码以及调用它的代码,这将有所帮助。你给我们看的代码没有编译。在你的循环中,你将i转换为value1,而这个值从来没有被构造函数初始化过。将其与value进行比较。正如我所说的:从枚举中删除字段value1,并将I与value进行比较,而不是将循环中的value1进行比较。您的代码仍然不能按原样编译:您有一行“private intvalue1;”,而不是“private intvalue1;”