【问题标题】:Android Studio-Kotlin: App Crashes when launched with error FATAL EXCEPTION: mainAndroid Studio-Kotlin:应用程序在启动时崩溃并出现错误致命异常:主要
【发布时间】:2020-07-09 16:36:40
【问题描述】:

当我在设备中启动应用程序时出现以下错误...检查清单文件,删除构建文件并重新启动 IDE。什么都没解决..请帮忙!

MainActivity.kt:

package com.bharat.scand_app


import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import com.external.scanlibrary.ScanActivity
import com.external.scanlibrary.ScanConstants

import java.io.IOException


class MainActivity : AppCompatActivity() {
    private val REQUEST_CODE = 99
    lateinit private var scanButton: Button
    lateinit private var cameraButton: Button
    lateinit private var mediaButton: Button
    lateinit private var scannedImageView: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }
    private fun init() {
        scanButton = (findViewById<Button>(R.id.scanButton))!!
        scanButton.setOnClickListener(ScanButtonClickListener())
        cameraButton = (findViewById<Button>(R.id.cameraButton))!!
        cameraButton.setOnClickListener(ScanButtonClickListener(ScanConstants.OPEN_CAMERA))
        mediaButton = (findViewById<Button>(R.id.galleryButton))!!
        mediaButton.setOnClickListener(ScanButtonClickListener(ScanConstants.OPEN_MEDIA))
        scannedImageView = (findViewById<ImageView>(R.id.scannedImage))!!
    }

    fun startScan(preference: Int) {
        val intent = Intent(this, ScanActivity::class.java)
        intent.putExtra(ScanConstants.OPEN_INTENT_PREFERENCE, preference)
        startActivityForResult(intent, REQUEST_CODE)
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            val uri: Uri? = data?.extras!!.getParcelable(ScanConstants.SCANNED_RESULT)
            var bitmap: Bitmap? = null
            try {
                bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
                if (uri != null) {
                    contentResolver.delete(uri, null, null)
                }
                scannedImageView.setImageBitmap(bitmap)
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }
    private fun convertByteArrayToBitmap(data: ByteArray): Bitmap? {
        return BitmapFactory.decodeByteArray(data, 0, data.size)
    }
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    val id: Int = item.getItemId()
    return if (id == R.id.action_settings) {
        true
    } else super.onOptionsItemSelected(item)
}
}

private class ScanButtonClickListener : View.OnClickListener {

    private var preference = 0
    val mActivity : MainActivity
        get() {
            TODO()
        }
    constructor(preference: Int) {
        this.preference = preference
    }

    constructor() {}
    override fun onClick(v: View?) {
        mActivity.startScan(preference)
        Log.d("appLog", "Hello World")
    }
}

Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/newLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/cameraButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="150dp"
        android:layout_marginTop="630dp"
        android:layout_marginEnd="100dp"
        android:layout_marginBottom="50dp"
        android:text="Camera"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/galleryButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="630dp"
        android:layout_marginEnd="20dp"
        android:layout_marginBottom="50dp"
        android:text="Gallery"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/cameraButton"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

在 logcat 中捕获的错误:

    --------- beginning of crash
    2020-07-09 21:50:00.093 7512-7512/com.myapp.scand_app E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.myapp.scand_app, PID: 7512
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.scand_app/com.bharat.scand_app.MainActivity}: kotlin.KotlinNullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3388)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3527)
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:214)
            at android.app.ActivityThread.main(ActivityThread.java:7710)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
         Caused by: kotlin.KotlinNullPointerException
            at com.bharat.scand_app.MainActivity.init(MainActivity.kt:37)
            at com.bharat.scand_app.MainActivity.onCreate(MainActivity.kt:34)
            at android.app.Activity.performCreate(Activity.java:7820)
            at android.app.Activity.performCreate(Activity.java:7809)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3363)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3527) 
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123) 
            at android.os.Handler.dispatchMessage(Handler.java:107) 
            at android.os.Looper.loop(Looper.java:214) 
            at android.app.ActivityThread.main(ActivityThread.java:7710) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

【问题讨论】:

标签: android-studio kotlin


【解决方案1】:
scanButton = (findViewById<Button>(R.id.scanButton))!!

你找到了scanButton,但是在activity_main.xml 中没有id 为scanButton 的按钮。您的 findViewById 调用返回 null,并且“!!”是空断言运算符,它在该行抛出 NPE。

解决方案:在您的 activity_mail.xml 中添加另一个 ID 为 scanButton 的按钮

【讨论】:

  • 感谢您的回复。实际上这个按钮在依赖模块下是可用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多