首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android Studio kotlin应用程序“继续停止”错误

Android Studio kotlin应用程序“继续停止”错误
EN

Stack Overflow用户
提问于 2021-07-10 13:30:18
回答 1查看 359关注 0票数 0
代码语言:javascript
运行
复制
package com.example.absolutelydumb

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.InputType
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*

//sets var to some random number and asks for a guess, giving feedback on proximity to answer
class MainActivity : AppCompatActivity() {
    private val startButton: Button = findViewById(R.id.startButton)
    private val submitButton: Button = findViewById(R.id.submit)
    private val instructionsText: TextView = findViewById(R.id.instructionView)
    private val response: EditText = findViewById(R.id.answerInput)


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

        val startText: String = getString(R.string.startText)
        startButton.text = startText

        //TODO("Add autofillHints")

        startButton.setOnClickListener {
            numberGuess()
        }
        //TODO("Set text back to start after guessing is done")
    }
    fun numberGuess() {
        response.inputType = InputType.TYPE_CLASS_NUMBER
        val clickText: String = getString(R.string.clickText)
        startButton.text = clickText
        //TODO("Add autofillHints")
        instructionsText.text = getString(R.string.instructions)
        val randomNumber: Int = rand(0,10)
        submitButton.setOnClickListener {
            val responseText = Integer.parseInt(answerInput.text.toString())
            if(responseText == randomNumber) {
                instructionsText.text = getString(R.string.correctGuess)
            } else {
                instructionsText.text = getString(R.string.badGuess)
            }
        }

    }
    fun rand(start: Int, end: Int): Int {
        //require(start <= end) { "Illegal Argument" }
        return (start..end).random()
    }
}

上面是我一直在写的代码。这是我的第一个项目,所以我不知道哪里出了问题。我修复了numberGuess函数中的变量类型问题,但是当我修复完它之后,应用程序就不打开了,虚拟设备声明了一个"app一直停止“错误。

下面是列出错误的运行日志。构建日志没有任何错误。

代码语言:javascript
运行
复制
07/09 19:58:05: Launching 'app' on phone1.
Install successfully finished in 1 s 266 ms.
$ adb shell am start -n "com.example.absolutelydumb/com.example.absolutelydumb.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 5935 on device 'phone1 [emulator-5554]'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.absolutelydumb, PID: 5935
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.absolutelydumb/com.example.absolutelydumb.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:159)
        at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)
        at android.content.Context.obtainStyledAttributes(Context.java:675)
        at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:692)
        at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:659)
        at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:479)
        at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:214)
        at com.example.absolutelydumb.MainActivity.<init>(MainActivity.kt:13)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-10 13:56:59

在调用findViewByIdsetContentView()之前,不能调用setContentView()。由于您在四个属性的声明站点上使用findViewById,所以在实例化活动类时,即在调用onCreate之前调用它。

有两种方法来处理这个问题。

  1. 使用lateinit var并在调用setContentView()之后立即设置属性
代码语言:javascript
运行
复制
private lateinit var startButton: Button
//...

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    button = findViewById(R.id.startButton)
    //...
  1. 使用by lazy,只在第一次访问属性时调用它,这将在调用setContentView()之后调用:
代码语言:javascript
运行
复制
private val startButton: Button by lazy { findViewById(R.id.startButton) }

或者您也可以使用视图绑定,它可以消除大部分这种样板,并且不太容易出错。我的意思是,您可以调用findViewById,意外地搜索当前布局中不存在的视图,并且它将在运行时崩溃。视图绑定使得这是不可能的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68328187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档