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

时间:2011-09-01 13:00:54

标签: java objective-c foreach

我正在尝试使用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
    }

在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;
    }

但我的问题是我收到此错误:Type mismatch: cannot convert from element type Object to ArrayList

有任何建议如何修复该错误?

第二个问题:我可以在Exception error中使用processSqlInjectQueries代替Obj-C中的NSError *error吗?

2 个答案:

答案 0 :(得分:7)

迭代ArrayList

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

for(Object b : injectQueries){
    ...
}

由于Objective-C中的NSDictionary类与Java中的Map类非常相似,因此您可以通过将b转换为Map来模仿Objective-C代码,甚至更好,您可以使用泛型来指定injectQueries包含Map个对象。例如:

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries, Exception error) {

    // some code

    for(Map<String,String> b : injectQueries) {
        ...
    }

    // some code
    return true;
}

异常处理

关于第二个问题,Java中的方法通常会抛出Exception个对象来传达错误条件,因此您的方法签名将类似于以下内容:

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) throws Exception

请注意,最好特定于您的异常(即抛出属于Exception的子类的对象),以便您的方法调用者知道出了什么问题。有关在Java中处理异常的其他指南,请参阅以下链接:

http://www.javapractices.com/home/HomeAction.do#Exceptions

答案 1 :(得分:1)

目标C代码通过包含NSDictionaries的NSArray传递给方法,因此以下内容可能更接近您想要做的...

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) {
    for(Map<String,String> q : injectQueries) {
        // do stuff with q
    }
}

要处理错误代码,您可能想要考虑抛出异常而不是尝试传递“Error”对象,如下所示:

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) throws Exception {
    for(Map<String,String> q : injectQueries) {
        // do stuff with q
    }

    if(errorConditionOccurs) {
       throw new Exception();
    }
}

您需要定制抛出的确切异常,以便它匹配您尝试执行的任何代码。

回应评论:或许这更接近你想要做的事情?

public boolean processSqlInjectQueries(JSONObject jsonObject) {
    for(String key : jsonObject.keys()) {
        Object value = jsonOnject.get(key);
        // Do stuff with value
    }
    // Do more stuff
}

你可以用:

来称呼它
processSqlInjectQueries(jsonData.getJSONObject("client_auth_hash"));