Java - Objective C - 针对每个循环问题

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中吗?

Man*_*qui 7

迭代ArrayList

引发错误是因为您的代码需要声明它b是一个Object(因为injectQueries包含类型的Object对象,而不是类型的对象ArrayList):

for(Object b : injectQueries){
    ...
}
Run Code Online (Sandbox Code Playgroud)

由于NSDictionary在Objective-C类非常类似于Map在Java类,您可以通过铸造模仿Objective-C代码bMap,甚至更好,你可以使用泛型指定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