2016-08-10 2 views
0

Я пытаюсь запустить kotlin со стандартным образцом в Android Studio. Прежде всего, я создаю новый проект с шаблоном активности входа, а затем конвертирую его в kotlin. Но у меня есть выполнения (не компилировать) ошибка в этой строке: списокcheckParameterIsNotNull error in Login Activity sample

loaderManager.initLoader(0, null, this) 

Ошибка:

Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter bundle 
+0

Вы не показывают трассировки стека, возможно, это еще один метод, который продвигает цепочку, когда что-то обращается к Котлину, который затем проверяет нулевое значение параметра. –

ответ

1

Ответ довольно прост, просто замените null опустошить Bundle():

loaderManager.initLoader(0, Bundle(), this) 

Но я не могу понять, почему котлин не поймал это на лету.

+0

Вероятно, Котлин поймал бы его, если ошибка была там, где этот вопрос предполагает. Полная трассировка стека, вероятно, показывает ошибку, происходящую где-то в другом месте, возможно, обратный вызов для Kotlin, который имеет переменную с нулевым значением с тем же именем? –

3

Как LoaderManager.initLoader(int, Bundle, LoaderManager.LoaderCallbacks) является кодом Java, Kotlin рассматривает его параметры как Int, Bundle!, LoaderManager.LoaderCallbacks<D!>!). Эти восклицательные знаки - это notation for platform types. Bundle! означает "Bundle или Bundle?". т. е. это способ Котлина заявить, что он не знает, является ли параметр ненулевым или нулевым.

Android имеет Java nullability annotations (а именно @NonNull и @Nullable), которые могут быть использованы для определения этого для компиляторов и т.д., чтобы использовать, но они не были использованы здесь. Если бы они были, Котлин вывел бы этот тип либо Bundle, либо Bundle? в зависимости от того, какая аннотация присутствует.

документация Android для args: Bundle! заявляет, что он не является обязательным, т.е. args: Bundle? (но компилятор Котлин не может сделать вывод, это потому, что в нем отсутствует @NonNull аннотацию). Если вы проверяете полную трассировку стека заброшенного исключения, я подозреваю, что вы найдете функцию Kotlin, которая получает args: Bundle, но должна получать args: Bundle?.

т.е. если у вас есть что-то вроде

override fun onCreateLoader(id: Int, args: Bundle): Loader<Cursor> = TODO() 

, то он должен быть вместо этого

override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> = TODO() 

, потому что компилятор Котлин вставляет не-нулевой чек на первое, но не последнее.

Для получения более подробной информации см. Null-Safety and Platform Types - Calling Java from Kotlin - Kotlin Programming Language.

0

Точный ответ изменить функцию onCreateLoader

override fun onCreateLoader(i: Int, bundle: Bundle?): Loader<Cursor>

0
loaderManager.initLoader(0,myBundle ?: Bundle(),this) 

Если myBundle является нулевым loadermanager будет использовать Bundle()