And*_*oid 1 java foreach objective-c
我正在尝试使用Objective-C(IPhone应用程序)中的一些代码在Android中构建应用程序.我正在尝试了解究竟是在做一段代码并将其转换为Java代码,但我想我需要一点点这里有帮助.首先,这里是Obj-C代码:
(BOOL)processSqlInjectQueries:(NSArray *)injectQueries error:(NSError**)error {
//some code
for(NSDictionary * q in injectQueries)
{
if (![q isKindOfClass:[NSDictionary class]]) continue;
StPacketInjectQueryPackage qType = (StPacketInjectQueryPackage)[[q objectForKey:@"type"] intValue];
NSString * query = [q objectForKey:@"query"];
}
//some code
}
Run Code Online (Sandbox Code Playgroud)
在Java中,我试图做这样的事情:
// in some other method :
JSONObject jsonData= new JSONObject();
String authHash = jsonData.getJSONObject("client_auth_hash").toString();
List<Map<String,String>> injectQueries= new ArrayList<Map<String,String>>();
injectQueries.add(new HashMap<String, String>());
//injectQueries.add(authHash);
public boolean processSqlInjectQueries(List<Map<String,String>> injectQueries, Exception error){
if(injectQueries==null || injectQueries.size()==0){
boolean injectsProcessed = this.processSqlInjectQueries(injectQueries,error);
if(!injectsProcessed){
return false;
}
}
Log.i("Info","Processing INJECT Queries...");
boolean res = true;
/*[_dbAdapter beginTransaction];
[_user.userDbAdapter beginTransaction];*/
for(Map<String,String> b : injectQueries){
if(b.getClass().getName()!=injectQueries.getClass().getName()){
continue;
}
//RPCPacketInjectQueryPackage qType = (RPCPacketInjectQueryPackage)
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是我得到了这个错误:Type mismatch: cannot convert from element type Object to ArrayList.
有任何建议如何修复该错误?
第二个问题:我可以Exception error在声明中使用processSqlInjectQueries而不是NSError *error在Obj-C中吗?
迭代ArrayList
引发错误是因为您的代码需要声明它b是一个Object(因为injectQueries包含类型的Object对象,而不是类型的对象ArrayList):
for(Object b : injectQueries){
...
}
Run Code Online (Sandbox Code Playgroud)
由于NSDictionary在Objective-C类非常类似于Map在Java类,您可以通过铸造模仿Objective-C代码b的Map,甚至更好,你可以使用泛型指定injectQueries包含Map的对象.例如:
public boolean processSqlInjectQueries(List<Map<String,String> injectQueries, Exception error) {
// some code
for(Map<String,String> b : injectQueries) {
...
}
// some code
return true;
}
Run Code Online (Sandbox Code Playgroud)
异常处理
至于第二个问题,Java中的方法通常通过抛出Exception对象来传达错误条件,因此您的方法签名将类似于以下内容:
public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) throws Exception
Run Code Online (Sandbox Code Playgroud)
请注意,最好特定于您的异常(即抛出作为其子类的对象Exception),以便您的方法调用者能够知道出了什么问题.有关在Java中处理异常的其他指导,请参阅以下链接:
http://www.javapractices.com/home/HomeAction.do#Exceptions