Search code examples
androidkotlinandroid-activitynullpointerexception

Error: java.lang.NullPointerException, need any help on getting it to work


i'm getting this error each time the button Medir is pressed, everything works with the rest

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

this is the MainActivity code:

    package com.example.kotlincalcinsu

    import android.content.Intent
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.Button
    import android.widget.TextView

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            val admin = AdminSQLiteOpenHelper(this, "AppDB", null, 1)
            val bd = admin.readableDatabase

            val name = bd.rawQuery("SELECT nombre FROM usuario", null).toString()
            val weight = bd.rawQuery("SELECT peso FROM usuario", null).toString()
            bd.close()

            //declarando TextView
            val nombre = findViewById<TextView>(R.id.Nombre)
            val peso = findViewById<TextView>(R.id.Peso)
            //declarando botones
            val medir = findViewById<Button>(R.id.medir)
            val historial = findViewById<Button>(R.id.historial)
            val registro = findViewById<Button>(R.id.registro)

            if (name.isNotEmpty() && weight.isNotEmpty()){
                nombre.text = name
                peso.text = weight
            }

            medir.setOnClickListener {
                val intent = Intent(this, Medir::class.java)
                startActivity(intent)
            }
            historial.setOnClickListener {
                val intent = Intent(this, Historial::class.java)
                startActivity(intent)
            }
            registro.setOnClickListener {
                val intent = Intent(this, Registro::class.java)
                startActivity(intent)
            }
        }
     }

And this is the Activity i'm trying to start




package com.example.kotlincalcinsu

import android.Manifest
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.content.Intent
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.ListView
import android.widget.Toast
import androidx.core.app.ActivityCompat

class Medir : AppCompatActivity() {

    private val REQUEST_CODE_ENABLE_BT:Int = 1
    private var bluetoothAdapter: BluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    private lateinit var pairedDevices: Set<BluetoothDevice>

    val selectDeviceList = findViewById<ListView>(R.id.selectorLV)

    companion object{
        val EXTRA_ADDRESS: String = "Device_address"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_medir)



        val refresh = findViewById<Button>(R.id.refresh)
        val conectar = findViewById<Button>(R.id.conectar)

        //inicializar BluetoothAdapter
        //bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
        //revisar si esta encendido el Bluetooth
        if (bluetoothAdapter == null){
            Toast.makeText(this, "This device doesn't support Bluetooth", Toast.LENGTH_LONG).show()
            return
        } else{
            Toast.makeText(this, "Bluetooth available", Toast.LENGTH_LONG).show()
        }

        if (!bluetoothAdapter!!.isEnabled){
            val enableBluetoothIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) return
            startActivityForResult(enableBluetoothIntent, REQUEST_CODE_ENABLE_BT)
        }

        refresh.setOnClickListener { pairedDeviceList() }


    }
    private fun pairedDeviceList(){
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { }
        pairedDevices = bluetoothAdapter!!.bondedDevices
        val list : ArrayList<BluetoothDevice> = ArrayList()

        if (pairedDevices.isNotEmpty()){
            for (device: BluetoothDevice in pairedDevices){
                list.add(device)
                Log.i("device", ""+device)
            }
        } else{
            Toast.makeText(this, "No paired Bluetooth devices", Toast.LENGTH_LONG).show()
        }

        val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, list)
            selectDeviceList.adapter = adapter
            selectDeviceList.onItemClickListener = AdapterView.OnItemClickListener{ _, _, position, _ ->
            val device: BluetoothDevice = list[position]
            val address: String = device.address

            val intent = Intent(this, ControlActivity::class.java)
            intent.putExtra(EXTRA_ADDRESS, address)
            startActivity(intent)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE_ENABLE_BT){
        if (resultCode == RESULT_OK){
            if (bluetoothAdapter!!.isEnabled){
                Toast.makeText(this, "Bluetooth has been enabled", Toast.LENGTH_LONG).show()
            } else{
                Toast.makeText(this, "Bluetooth has been disabled", Toast.LENGTH_LONG).show()
            }
        } else if (resultCode == RESULT_CANCELED){
            Toast.makeText(this, "Bluetooth enableing has been canceled", Toast.LENGTH_LONG).show()
        }
    }
}

}

and the AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="true">
    </uses-feature>
    <uses-feature
        android:name="android.hardware.bluetooth"
        android:required="true">
    </uses-feature>

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.KotlinCalcInsu"
        tools:targetApi="31">
        <activity
            android:name=".Historial"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".Medir"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".Registro"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

everything appears to be right according to teachers and other people that have take a look at it, but it just keeps throwing that error and crashing the app. Any help is welcome and thanks beforehand

i have already tried different computers Mac and Windows, tried with different versions of Android and Android Studio. I rewrite the code to check if there was some typing error or just something wrong with the files, but nothing worked.


Solution

  • Anything like these lines:

    private var bluetoothAdapter: BluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    
    val selectDeviceList = findViewById<ListView>(R.id.selectorLV)
    

    in an Activity will cause a crash. You cannot call Activity functions safely in property initializers, because the Activity hasn't been set up until onCreate() is called. Property initializers are called before onCreate.

    You either need to change these to lateinit and initialize them in onCreate, or you can turn them into Lazy properties -- replace = /*...*/ with by lazy { /*...*/ }.

    For future reference, the stack trace gives you the exact line of code that causes the problem. If you have issues in the future that you cannot solve, you need to post the stack trace and the code that is referenced by the stack trace.