Как безопасно разыграть бросок в блоке Try-Catch - PullRequest
0 голосов
/ 20 сентября 2019

Вот как можно безопасно разыграть в Try-Catch Block, используя Kotlin.Это проблема синтаксиса.Для Kotlin нет ответа, связанного с этим, поэтому я поделюсь этим, чтобы сэкономить время для других.

Обычно для безопасного произнесения люди используют этот формат:

fun functionName() {
    if (propertyName is ClassName1) {
        val variableName2 = propertyName as ClassName1()
        propertyName.memberFunction()
    }
}

Следующеекод покажет, когда возникнет ошибка компиляции (я мог бы показать слишком много, но я хочу, чтобы вы, ребята, поняли контекст):

import android.graphics.Canvas
import android.view.SurfaceHolder
import java.lang.Exception

class MainThread(surfaceHolder: SurfaceHolder, gameView: GameView): Thread() {
    private lateinit var surfaceHolder: SurfaceHolder
    private lateinit var gameView: GameView
    private var running: Boolean = false
    private var canvas: Canvas? = null

    override fun run() {
        super.run()

        while(running) {
            try { 
                canvas = this.surfaceHolder.lockCanvas() 
                synchronized(surfaceHolder) {
                    this.gameView.update()
                    this.gameView.draw(canvas) // Error arises at this line
                }
            } catch (e: Exception) {
            } finally {
                if(canvas != null){
                    try {
                        surfaceHolder.unlockCanvasAndPost(canvas)
                    } catch (e: Exception){
                        e.printStackTrace()
                    }
                }
            }
        }
    }

Ошибка вывода сборки:

Smart cast to 'Canvas' is impossible, 
because 'canvas' is a mutable property that could have been changed by this time

1 Ответ

0 голосов
/ 20 сентября 2019

Вы фактически должны поместить ключевое слово as в круглые скобки.

Следующий код покажет, как реализовать интеллектуальное приведение в блоке try-catch:

    override fun run() {
        super.run()

        while(running) {
            try { 
                canvas = this.surfaceHolder.lockCanvas() 
                synchronized(surfaceHolder) {
                    this.gameView.update()
if (canvas is Canvas)
                    this.gameView.draw(canvas as Canvas) // Note change
                }
            } catch (e: Exception) {
            } finally {
                if(canvas != null){
                    try {
                        surfaceHolder.unlockCanvasAndPost(canvas)
                    } catch (e: Exception){
                        e.printStackTrace()
                    }
                }
            }
        }
    }
...