2016-06-21 19 views
10

Sto provando a codificare la mia app in Kotlin, ma sto ottenendo null non può essere convertito in tipo non nullo e arresti forza app quando apro EditNoteActivity su EXTRA_NOTE probabilmente.kotlin.TypeCastException: null non può essere trasmesso a un tipo non nullo com.midsizemango.databasekotlin.Note

Ogni aiuto è molto apprezzato

Codice:

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([email protected], "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([email protected]) 
        .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([email protected], 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: impossibile avviare l'attività ComponentInfo { com.midsizemango.databasekotlin/com .midsizemango.databasekotlin.EditNoteActivity}: kotlin.TypeCastException: non è possibile eseguire il cast di null su un tipo non null com.mids izemango.databasekotlin.Note a android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2298) a android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) a android.app.ActivityThread.access $ 800 (ActivityThread. java: 144) a android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) su android.os.Handler.dispatchMessage (Handler.java:102) su android.os.Looper.loop (Looper .java: 135) su android.app.ActivityThread.main (ActivityThread.java:5221) su java.lang.reflect.Method.invoke (metodo nativo) su java.lang.re flect.Method.invoke (Method.java:372) a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) su com.android.internal.os.ZygoteInit.main (ZygoteInit .java: 694) provocato da: kotlin.TypeCastException: null non può essere lanciato per non nullo tipo com.midsizemango.databasekotlin.Note a com.midsizemango.databasekotlin.EditNoteActivity.onCreate (EditNoteActivity.kt: 82) su android.app.Activity.performCreate (Activity.java:5933) a android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1105) a android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2251) a android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) a android.app.ActivityThread.access $ 800 (ActivityThread.java:144) a android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) su android.os.Handler.dispatchMessage (Handler.java:102) su android.os.Looper.loop (Looper.java:135) su android.app.ActivityThread.main (ActivityThread.java:5221) su java.lang.reflect.Method.invoke (Metodo nativo) a java.lang.reflect.Method.invoke (Method.java:372) a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) a com.android.internal.os .ZygoteInit.main (ZygoteInit.java: 694)

risposta

38

In questa linea:

note = intent.getSerializableExtra(EXTRA_NOTE) as Note 

Note è un non-null type, in modo che il getto ad esso innesca un controllo nullo. Dal momento che si sta confrontando note a null manualmente in seguito, probabilmente si intende la safe cast operator, che produce null se l'espressione non è del tipo specificato nella parte destra:

note = intent.getSerializableExtra(EXTRA_NOTE) as? Note 
+1

Proprio come Swift! – Dante

+0

prova non funziona –

+1

@Dante Kotlin versione iniziale: 2011, versione iniziale di Swift: 2014. Penso che sia il contrario;) – pablisco

Problemi correlati