1. 程式人生 > >An operation is not implemented: not implemented被坑之路[Kotlin]

An operation is not implemented: not implemented被坑之路[Kotlin]

吐槽一下,程式猿的辛酸史。
今天在開發新專案時,首次使用了Kotlin語言,對於之前只在紙上談兵,未在專案中使用過的碼農,很是一臉懵逼。但是迫於公司的要求,只能硬頭皮衝吧。

在編寫下面程式碼時:

holder?.addCallback(object :SurfaceHolder.Callback{
            override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
                TODO("not implemented") //To change body of created functions use File
} override fun surfaceDestroyed(holder: SurfaceHolder?) { TODO("not implemented") //To change body of created functions use File } override fun surfaceCreated(holder: SurfaceHolder?) { TODO("not implemented") //To change body of created functions use File
} })

專案直接閃退,在檢視崩潰時,報以下錯誤:

Process: com.example.gaozhongkui.camerademo, PID: 28490
    kotlin.NotImplementedError: An operation is not implemented: not implemented
        at com.example.gaozhongkui.camerademo.MainActivity$onCreate$1.surfaceCreated(MainActivity.kt:44)
        at android.
view.SurfaceView.updateSurface(SurfaceView.java:732) at android.view.SurfaceView$2.onPreDraw(SurfaceView.java:150) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:977) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2747) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1650) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7579) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) at android.view.Choreographer.doCallbacks(Choreographer.java:732) at android.view.Choreographer.doFrame(Choreographer.java:664) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:183) at android.app.ActivityThread.main(ActivityThread.java:7014) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

很是一臉懵逼,因為未寫任何程式碼,就會導致崩潰,在經過Google才恍然大霧。我們在繼承介面時,使用IDE自動幫助生成需要實現方式時,會自動新增:

 TODO("not implemented") //To change body of created functions use File | Settings | File Templates.

重點就在TODO,有這個函式,它是要求你必須實現程式碼塊。所以只需要刪除TODO(“not implemented”) 這句話就可以了。

作為一枚程式猿有一種刨根問底的精神,在檢視原始碼時,發現以下的貓膩:

@kotlin.internal.InlineOnly
public inline fun TODO(reason: String): Nothing = throw NotImplementedError("An operation is not implemented: $reason")

原來是TODO這個函式主動丟擲的問題,現在終於知道原因了。

這是官網對kotlin TODO描述地址