使用科特林与ContentResolver的引起抛出:IllegalArgumentException [英] Using kotlin with ContentResolver caused IllegalArgumentException

查看:2593
本文介绍了使用科特林与ContentResolver的引起抛出:IllegalArgumentException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试着写与科特林的应用程序。我把ContentProvider的另一过程查询SQL。当ContentResolver的主流程查询,在App坠毁。

在code是:

 保护乐趣选择(URI:URI,SQL:字符串,VARARG ARGS:任意):光标{
    VAL个SARG =阵列(args.size(),{I - > lang.String.valueOf(args.get(ⅰ))})
    返回context.getContentResolver()查询(URI,空,SQL,个SARG,NULL)
}公共乐趣selectAllAccounts():数组<&帐户GT; {
    VAL光标=选择(parseUri(AccountSchema.TABLE_NAME),+ AccountSchema.TABLE_NAME,从选择*)
    VAL占=阵列(cursor.getCount(){I - >
        如果(!cursor.moveToPosition(ⅰ)){
            抛出的RuntimeException(移动光标失败)
        }
        帐户(背景下,光标)
    })
    返回账户
}

这将抛出IllegalArgumentException:

  10月5日至20日:27:21.120 3337-3337 / com.kescoode.yomail E / AndroidRuntime:致命异常:主要
工艺:com.kescoode.yomail,PID:3337
了java.lang.RuntimeException:无法启动活动ComponentInfo {com.kescoode.yomail / com.kescoode.yomail.ui.activity.HomeActivity}:java.lang.IllegalArgumentException异常:指定非空参数为空:方法kotlin.jvm .internal.Intrinsics.checkParameterIsNotNull,参数投影
        在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
        在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
        在android.app.ActivityThread.access $ 800(ActivityThread.java:144)
        在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1205)
        在android.os.Handler.dispatchMessage(Handler.java:102)
        在android.os.Looper.loop(Looper.java:136)
        在android.app.ActivityThread.main(ActivityThread.java:5146)
        在java.lang.reflect.Method.invokeNative(本机方法)
        在java.lang.reflect.Method.invoke(Method.java:515)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:732)
        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
        在dalvik.system.NativeStart.main(本机方法)
 java.lang.IllegalArgumentException异常:引起指定非空参数为空:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数投影
        在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
        在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
        在android.content.ContentProviderProxy.query(ContentProviderNative.java:420)
        在android.content.ContentResolver.query(ContentResolver.java:461)
        在android.content.ContentResolver.query(ContentResolver.java:404)
        在com.kescoode.yomail.db.Dao.select(internal.kt:33)
        在com.kescoode.yomail.db.AccountDao.selectAllAccounts(AccountDao.kt:21)
        在com.kescoode.yomail.App.isLogged(App.kt:28)
        在com.kescoode.yomail.ui.activity.HomeActivity.onCreate(HomeActivity.kt:17)
        在android.app.Activity.performCreate(Activity.java:5231)
        在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169


在科特林

解决方案

默认情况下所有变量和参数都非空。你是一个null参数传递给你的函数。如果你想传递空参数,你需要添加 符号添加到您的参数类型,如 URI:?乌里。但更好的方法是检查,如果你想传递给函数的参数为​​null,处理这种情况。
欲了解更多信息,您可以检查本文 http://kotlinlang.org/docs/reference/null -safety.html

I'm try to write an app with Kotlin. I put the contentprovider querying sql on the other process. When querying by ContentResolver in the main process, the App crashed.

The code is:

protected fun select(uri: Uri, sql: String, vararg args: Any): Cursor {
    val sArgs = Array(args.size(), { i -> lang.String.valueOf(args.get(i)) })
    return context.getContentResolver().query(uri, null, sql, sArgs, null)
}

public fun selectAllAccounts(): Array<Account> {
    val cursor = select(parseUri(AccountSchema.TABLE_NAME), "select * from " + AccountSchema.TABLE_NAME)
    val accounts = Array(cursor.getCount(), { i ->
        if (!cursor.moveToPosition(i)) {
            throw RuntimeException("Cursor move failed")
        }
        Account(context, cursor)
    })
    return accounts
}

It will throw an IllegalArgumentException:

05-20 10:27:21.120    3337-3337/com.kescoode.yomail E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.kescoode.yomail, PID: 3337
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kescoode.yomail/com.kescoode.yomail.ui.activity.HomeActivity}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter projection
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5146)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter projection
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:420)
        at android.content.ContentResolver.query(ContentResolver.java:461)
        at android.content.ContentResolver.query(ContentResolver.java:404)
        at com.kescoode.yomail.db.Dao.select(internal.kt:33)
        at com.kescoode.yomail.db.AccountDao.selectAllAccounts(AccountDao.kt:21)
        at com.kescoode.yomail.App.isLogged(App.kt:28)
        at com.kescoode.yomail.ui.activity.HomeActivity.onCreate(HomeActivity.kt:17)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169  

解决方案

By default all the variables and parameters in Kotlin are non-null. You are passing a null parameter to your function. If you want to pass null parameter you need to add ? symbol to your parameter's type, like uri: Uri?. But better way is to check if the parameter you want to pass to the function is null and handle this situation. For more information you can check this article http://kotlinlang.org/docs/reference/null-safety.html

这篇关于使用科特林与ContentResolver的引起抛出:IllegalArgumentException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆