Android Studio Конвертировать Java в Kotlin 2 ошибки - PullRequest
0 голосов
/ 08 сентября 2018

После преобразования Java-файла в файл Kotlin выдает две ошибки в одной строке: В приведенном ниже коде показаны переменные и функция с ошибкой

     lateinit var ncArr: Array<ImageButton>
     lateinit var xBitmap: Bitmap
     lateinit var oBitmap: Bitmap
     lateinit var intArr: IntArray
     lateinit var btnStartGame: Button
     lateinit var btnMenu: Button
     var stop: Boolean = false
     var gameMode: Int = 0
     var umove: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onStart()
    setContentView(R.layout.activity_game)

    ncArr = arrayOfNulls(9)

    ncArr[0] = findViewById(R.id.nc0) as ImageButton
    ncArr[1] = findViewById(R.id.nc1) as ImageButton
    ncArr[2] = findViewById(R.id.nc2) as ImageButton
    ncArr[3] = findViewById(R.id.nc3) as ImageButton
    ncArr[4] = findViewById(R.id.nc4) as ImageButton
    ncArr[5] = findViewById(R.id.nc5) as ImageButton
    ncArr[6] = findViewById(R.id.nc6) as ImageButton
    ncArr[7] = findViewById(R.id.nc7) as ImageButton
    ncArr[8] = findViewById(R.id.nc8) as ImageButton

    ncArr[0].setOnClickListener(this)
    ncArr[1].setOnClickListener(this)
    ncArr[2].setOnClickListener(this)
    ncArr[3].setOnClickListener(this)
    ncArr[4].setOnClickListener(this)
    ncArr[5].setOnClickListener(this)
    ncArr[6].setOnClickListener(this)
    ncArr[7].setOnClickListener(this)
    ncArr[8].setOnClickListener(this)

    xBitmap = BitmapFactory.decodeResource(resources, R.drawable.x)
    oBitmap = BitmapFactory.decodeResource(resources, R.drawable.o)

    intArr = IntArray(9)

    for (i in 0..8) {
        intArr[i] = 0
    }

    btnMenu = findViewById(R.id.btnMenu) as Button
    btnStartGame = findViewById(R.id.btnStartGame) as Button
    btnMenu.setOnClickListener(this)
    btnStartGame.setOnClickListener(this)

    stop = false

    gameMode = intent.getIntExtra("game_mode", 1)
    umove = 1
}

в строке ncArr = arrayOfNulls(9) Есть ошибки: enter image description here

Я пытаюсь решить эту проблему, но у меня нет больше идей ...

Любое решение?

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018
ncArr = arrayOfNulls(9)

Тип ncArr будет Array<ImageButton?>

ncArr[0] = findViewById(R.id.nc0) as ImageButton

Вы используете небезопасный оператор приведения as, поскольку оператор приведения вызывает исключение, если приведение невозможно. Таким образом, мы называем это небезопасным. Что будет, если

findViewById(R.id.nc0) as ImageButton

return null, тогда null не может присвоить ImageButton, это вызовет исключение и приведет к аварийному завершению вашего приложения.

Чтобы избежать вышеуказанной ошибки, вы можете использовать

ncArr[0] = findViewById(R.id.nc0) as ImageButton?

или с использованием оператора безопасного приведения as?

ncArr[0] = findViewById(R.id.nc0) as? ImageButton

Не забудьте подать заявку на ncArr[0] до ncArr[8].

Обновление : По вашему запросу вы можете использовать это решение:

lateinit var ncArr: Array<ImageButton>
    lateinit var xBitmap: Bitmap
    lateinit var oBitmap: Bitmap
    lateinit var intArr: IntArray
    lateinit var btnStartGame: Button
    lateinit var btnMenu: Button
    var stop: Boolean = false
    var gameMode: Int = 0
    var umove: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onStart()
        setContentView(R.layout.activity_game)

        ncArr = arrayOf(
                findViewById<ImageButton>(R.id.nc0).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc1).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc2).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc3).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc4).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc5).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc6).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc7).apply{setOnClickListener(this@GameActivity)},
                findViewById<ImageButton>(R.id.nc8).apply{setOnClickListener(this@GameActivity)}

        )

        xBitmap = BitmapFactory.decodeResource(resources, R.drawable.x)
        oBitmap = BitmapFactory.decodeResource(resources, R.drawable.o)

        // Your code here
        ...
}
0 голосов
/ 08 сентября 2018

Вы пытаетесь поместить массив Nullable в NonNull. Вы можете объявить intArr как Array<ImageButton?>, и все будет работать.

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