添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

kotlin.TypeCastException: null cannot be cast to non-null type com.midsizemango.databasekotlin.Note

Ask Question

I am trying to code my app in Kotlin, but I am getting null cannot be casted to non-null type and app force stops when I open EditNoteActivity at EXTRA_NOTE probably.

Any Help is Highly Appreciated

Code:

class EditNoteActivity : AppCompatActivity() {
var note: Note? = null
private val editNote: TextView? = null
private val fabdrwble: Boolean? = null
private val notesData: MutableList<Note>? = null
private var databaseHelper: DatabaseHelper? = null
private val save: Boolean? = null
private var saveButton: FloatingActionButton? = null
private val tint: ColorStateList? = null
internal var mRowId: Long? = null
internal var spinner: Spinner? = null
internal var spinnertext: String? = null
internal var fav: Int = 0
internal var mSharedFromIntentFilter = false
internal var editTitle: EditText? = null
internal var editContent: EditText? = null
internal var inputlayoutTitle: TextInputLayout? = null
internal var inputlayoutContent: TextInputLayout? = null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_edit_note)
    var toolbar = findViewById(R.id.toolbar_edit) as Toolbar?
    setSupportActionBar(toolbar)
    if (supportActionBar != null)
        supportActionBar!!.setDisplayHomeAsUpEnabled(true)
    databaseHelper = DatabaseHelper(applicationContext)
    inputlayoutTitle = findViewById(R.id.inputlayoutTitle) as TextInputLayout?
    inputlayoutContent = findViewById(R.id.inputlayoutContent) as TextInputLayout?
    editTitle = findViewById(R.id.note_title) as EditText
    editContent = findViewById(R.id.note_content) as EditText?
    val bundle = intent.extras
    val s = bundle.getString("edit")
    if (s == "add") {
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
    } else if (s == "editv") {
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
    note = intent.getSerializableExtra(EXTRA_NOTE) as Note
    if (note != null) {
        editTitle?.setText(note!!.getTitle())
        editContent?.setText(note!!.getContent())
    } else {
        note = Note()
        //note.setUpdatedAt(new Date());
    saveButton = findViewById(R.id.add_edit_button) as FloatingActionButton?
    saveButton!!.setOnClickListener {
        if (isNoteFormOk) {
            setNoteResult()
            finish()
        } else
            validateNoteForm()
    var ll = findViewById(R.id.llmain) as LinearLayout?
    var ll1 = findViewById(R.id.ll1) as LinearLayout?
    /*if(note.getColor() == Color.TRANSPARENT){
        selectedColor = preselect;
    }else {
        selectedColor = note.getColor();
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    systemBarTintManager = new SystemBarTintManager(this);
    systemBarTintManager.setStatusBarTintEnabled(true);
    ll.setBackgroundColor(selectedColor);
    ll1.setBackgroundColor(selectedColor);
    toolbar.setBackgroundColor(note.getColor());
    systemBarTintManager.setStatusBarTintColor(selectedColor);*/
override fun onResume() {
    super.onResume()
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        android.R.id.home -> {
            onBack()
            return true
        case R.id.speech:
            try {
                displaySpeechRecognizer();
            } catch (ActivityNotFoundException e) {
                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://market.android.com/details?id=com.google.android.googlequicksearchbox"));
                startActivity(browserIntent);
            return true;*/
        else -> return super.onOptionsItemSelected(item)
private fun displaySpeechRecognizer() {
    val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
    startActivityForResult(intent, SPEECH_REQUEST_CODE)
override fun onActivityResult(requestCode: Int, resultCode: Int,
                              data: Intent) {
    if (requestCode == SPEECH_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        val results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
        val spokenText = results[0]
        editContent?.setText(spokenText)
    if (requestCode == RequestResultCode.REQUEST_CODE_ADD_NOTE) {
        if (resultCode == Activity.RESULT_OK) {
            addNote(data)
private val isNoteFormOk: Boolean
    get() {
        val title = editTitle?.text.toString()
        return !(title == null || title.trim { it <= ' ' }.length == 0)
private fun validateNoteForm() {
    var msg: String? = null
    if (isNullOrBlank(editTitle?.text.toString())) {
        msg = "Title Required"
        inputlayoutTitle?.error = "Title is Missing"
    if (msg != null) {
        Toast.makeText(applicationContext, msg, Toast.LENGTH_LONG).show()
private fun setNoteResult() {
    note!!.setTitle(editTitle?.text.toString().trim { it <= ' ' })
    note!!.setContent(editContent?.text.toString().trim { it <= ' ' })
    //note.setUpdatedAt(new Date());
    val intent = Intent()
    intent.putExtra(EXTRA_NOTE, note)
    setResult(Activity.RESULT_OK, intent)
    //addNote(intent);
    Toast.makeText(this@EditNoteActivity, "Note Saved.", Toast.LENGTH_LONG).show()
private fun onBack() {
    if (isNoteFormOk) {
        if (editTitle?.text.toString() == note!!.getTitle() && editContent?.text.toString() == note!!.getContent()) {
            setResult(Activity.RESULT_CANCELED, Intent())
            finish()
        } else {
            AlertDialog.Builder(this@EditNoteActivity)
                    .setTitle("Save")
                    .setMessage("Do You Want to Save Note")
                    .setPositiveButton("SAVE") { dialog, which ->
                        setNoteResult()
                        finish()
            }.setNegativeButton("CANCEL") { dialog, which ->
                setResult(Activity.RESULT_CANCELED, Intent())
                finish()
            }.show()
    } else {
        setResult(Activity.RESULT_CANCELED, Intent())
        finish()
private fun addNote(data: Intent) {
    val note = data.getSerializableExtra(EXTRA_NOTE) as Note
    val noteId = databaseHelper!!.createNote(note)
    note.setId(noteId)
override fun onBackPressed() {
    onBack()
    val intentHome = Intent(this@EditNoteActivity, MainActivity::class.java)
    intentHome.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
    intentHome.putExtra(EXTRA_NOTE, note)
    setResult(Activity.RESULT_OK, intentHome)
companion object {
    private val EXTRA_NOTE = "EXTRA_NOTE"
    private val SPEECH_REQUEST_CODE = 0
    fun isNullOrBlank(str: String?): Boolean {
        return str == null || str.trim { it <= ' ' }.length == 0

Logs:

java.lang.RuntimeException: Unable to start activity ComponentInfo{
com.midsizemango.databasekotlin/com.midsizemango.databasekotlin.EditNoteActivity}:
kotlin.TypeCastException: null cannot be cast to non-null type
com.midsizemango.databasekotlin.Note
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
    at android.app.ActivityThread.access$800(ActivityThread.java:144)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: kotlin.TypeCastException: null cannot be cast to non-null type com.midsizemango.databasekotlin.Note
    at com.midsizemango.databasekotlin.EditNoteActivity.onCreate(EditNoteActivity.kt:82)
    at android.app.Activity.performCreate(Activity.java:5933)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
    at android.app.ActivityThread.access$800(ActivityThread.java:144) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5221) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)

Note is a non-null type, so the cast to it triggers a null check. Since you're comparing note to null manually afterwards, probably you meant the safe cast operator, which yields null if the expression is not of the type specified in the right-hand side:

note = intent.getSerializableExtra(EXTRA_NOTE) as? Note
                @Dante Kotlin initial release: 2011, Swift initial release: 2014. I think it's the other way around ;)
– pablisco
                Feb 19, 2018 at 20:24
                Because it doesn't know the value at compile time. Only at runtime it detects null value.
– Prudhvi
                Nov 18, 2020 at 16:13

Beware, this answer relates only to some very special cases.

On Kotlin/JS there is fun <T> Any?.unsafeCast(): T extension which "reinterprets this value as a value of the specified type T without any actual type checking".

And, primarily for performance reasons, it was ported to Kotlin/JVM in https://github.com/JakeWharton/confundus with help of a custom compiler plugin which just removes all calls to unsafeCast() in bytecode.

The unsafeCast() can also be used to abuse compiler nullability checks in case of misalignment of nullability contracts between Kotlin and Java code in some legacy integrations.

Note that Confundus is currently not compatible with Kotlin 1.7 or later: github.com/JakeWharton/confundus/issues/16 – Vadzim Oct 13 at 16:38

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.