Почему я получаю сообщение об ошибке «as non-null is null» после того, как Android Studio автоматически преобразует код Java в код Kotlin? - PullRequest
0 голосов
/ 03 июня 2018

Когда я копирую и вставляю код B (код Java) в Android Studio 3.1.2, я выбираю автоматическое преобразование в код Kotlin.

Таким образом, я получаю показанный код A в Kotlin, но со следующей ошибкой.Почему?

Почему эта ошибка возникает, когда Android Studio автоматически преобразует код Java в код Kotlin?

Кстати, код B (код Java) работает хорошо.

Ошибка

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter state
at ui.DialogChangePassword.showDialog(DialogChangePassword.kt)

Код A (код Котлина)

class DialogChangePassword(context: Context, attrs: AttributeSet) : DialogPreference(context, attrs) {
    private var mView: View? = null

    init {
        dialogLayoutResource = R.layout.item_custom_password_dialog
    }

    override fun onCreateDialogView(): View? {
        // TODO Auto-generated method stub
        mView = super.onCreateDialogView()
        return mView
    }


    override fun onDialogClosed(positiveResult: Boolean) {
        super.onDialogClosed(positiveResult)
    }

    override fun showDialog(state: Bundle) {
        // Call show on default first so we can
        // override the handlers
        super.showDialog(state)

        val d = dialog as AlertDialog
        d.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
            if (IsInputOKAndSavePassword()) {
                d.dismiss()
            }
        }
    }

    private fun IsInputOKAndSavePassword(): Boolean {

        return true
    }

}

Код B (код Java)

public class DialogChangePassword extends DialogPreference {
    private View mView;

    public DialogChangePassword(Context context, AttributeSet attrs) {
        super(context, attrs);
        setDialogLayoutResource(R.layout.item_custom_password_dialog);
    }

    @Override
    protected View onCreateDialogView() {
        // TODO Auto-generated method stub
        mView = super.onCreateDialogView();
        return mView;
    }


    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
    }

    @Override
    protected void showDialog(Bundle state) {
        // Call show on default first so we can
        // override the handlers
        super.showDialog(state);

        final AlertDialog d = (AlertDialog) getDialog();
        d.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (IsInputOKAndSavePassword()){
                            d.dismiss();
                        }
                    }
                });
    }


    private boolean IsInputOKAndSavePassword(){
        boolean result=true;

        return result;
    }


}

1 Ответ

0 голосов
/ 03 июня 2018

Котлин относится к null как к первоклассному гражданину, различая типы, допускающие обнуление (например, Bundle?), и типы, не допускающие обнуления (например, Bundle).

как вы знаете, экземпляр Bundle может быть нулевым в зависимости от того, на какой фазе жизненного цикла компонента вы находитесь в данный момент. Например, при первом создании экземпляра Activity, onCreate()вызывается с нулевым значением Bundle, потому что нет состояния для восстановления.если тот же Activity воссоздан из-за изменения конфигурации, однако, onCreate() можно вызвать с ненулевым экземпляром Bundle (в котором вы, возможно, сохранили некоторые данные, чтобы помочь воссоздать связанный экран).

учитывая столько же, подпись showDialog должна быть написана таким образом, чтобы допустить вероятность того, что state может быть нулевым, например:

    override fun showDialog(state: Bundle?) {
        ...
    }

надеюсь, чтопомогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...