Hiroyuan 2023-03-18 16:36 采纳率: 100%
浏览 146
已结题

安卓报错:Attempt to invoke virtual method

不知道为啥,一按按钮,软件就闪退。求援助。

这个是报错日志

 E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.exercise2_4, PID: 10924
                                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                                                                        at com.example.exercise2_4.MainActivity.refreshText(MainActivity.java:105)
                                                                                                        at com.example.exercise2_4.MainActivity.onClick(MainActivity.java:78)
                                                                                                        at android.view.View.performClick(View.java:7441)
                                                                                                        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
                                                                                                        at android.view.View.performClickInternal(View.java:7418)
                                                                                                        at android.view.View.access$3700(View.java:835)
                                                                                                        at android.view.View$PerformClick.run(View.java:28676)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:938)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7839)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

这个是java源代码 报错处我已经加粗

package com.example.exercise2_4;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private  TextView txt;
    private  String firstNum = "";
    private  String operator = "";
    private  String secondNum = "";
    private  String result = "";
    private  String showText = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView txt =findViewById(R.id.tv01);
        findViewById(R.id.btn_cancel).setOnClickListener(this);
        findViewById(R.id.one).setOnClickListener(this);
        findViewById(R.id.two).setOnClickListener(this);
        findViewById(R.id.three).setOnClickListener(this);
        findViewById(R.id.four).setOnClickListener(this);
        findViewById(R.id.five).setOnClickListener(this);
        findViewById(R.id.six).setOnClickListener(this);
        findViewById(R.id.seven).setOnClickListener(this);
        findViewById(R.id.eight).setOnClickListener(this);
        findViewById(R.id.nine).setOnClickListener(this);
        findViewById(R.id.zero).setOnClickListener(this);
        findViewById(R.id.add).setOnClickListener(this);
        findViewById(R.id.minus).setOnClickListener(this);
        findViewById(R.id.multiply).setOnClickListener(this);
        findViewById(R.id.chuyu).setOnClickListener(this);
        findViewById(R.id.denyu).setOnClickListener(this);
        findViewById(R.id.point).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        String inPutText;
        inPutText = ((TextView)v).getText().toString();
        switch(v.getId()){
            case R.id.btn_cancel:
                clear();
                break;
            case R.id.add:
            case R.id.minus:
            case R.id.multiply:
            case R.id.chuyu:
                operator =  inPutText;
                refreshText(showText + operator);
                break;

            case R.id.denyu:
                double calculate_result =calculateFour();
                refreashOperate(String.valueOf(calculate_result));
                refreshText(showText + "=" + result);
                break;

            default:
                if(result.length() > 0 && operator.equals("")){
                    clear();
                }

                if(operator.equals("")){
                    firstNum = firstNum + inPutText;
                }else{
                secondNum = secondNum +inPutText;
            }
            if(showText.equals("0") && !inPutText.equals(".")) {
                refreshText(inPutText);
            }else{
               ** refreshText(showText + inPutText);**
            }
        }

    }

    private double calculateFour() {
        switch(operator){
            case "+":
                return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);

            case "-":
                return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);


            case "*":
                return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);

            case "/":
                return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);

        }
        return 0;
    }

    private void refreshText(String text) {
        showText = text;
        **txt.setText(showText);**
    }

    private  void refreashOperate(String new_result){
        result  = new_result;
        firstNum = result;
        secondNum = "";
        operator = "";
    }

    private void clear() {
        refreshText("");
        refreashOperate("");
    }
}

下面是我的布局文件

<?xml version="1.0" encoding="utf-8"?>
<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:rowCount="6"
    android:columnCount="4"
    android:padding="5dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_columnSpan="4"
        android:gravity="center"
        android:text="计算器"
        android:textSize="20sp"
        android:background="#EEEEEE">
    </TextView>

    <TextView
        android:id="@+id/tv01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_columnSpan="4"
        android:lines="2"
        android:gravity="right|bottom"
        android:text="0"
        android:textSize="50dp">
    </TextView>

    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_columnSpan="4"
        android:text="清除"
        android:textSize="26sp"
        android:layout_margin="8dp">
    </Button>

    <Button
        android:id="@+id/one"
        android:text="1"
        android:textSize="26sp"
        android:layout_margin="5dp">
    </Button>

    <Button
        android:id="@+id/two"
        android:text="2"
        android:textSize="26sp"
        android:layout_margin="5dp">
    </Button>

    <Button
        android:id="@+id/three"
        android:text="3"
        android:textSize="26sp"
        android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/add"
        android:text="+"
        android:textSize="26sp"
        android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/four"
        android:text="4"
        android:textSize="26sp"
        android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/five"
        android:text="5"
        android:textSize="26sp"
        android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/six"
        android:text="6"
        android:textSize="26sp"
        android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/minus"
        android:text="-"
        android:textSize="26sp"
        android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/seven"
    android:text="7"
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/eight"
    android:text="8"
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/nine"
    android:text="9"
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/multiply"
    android:text="*"
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/point"
    android:text="."
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/zero"
    android:text="0"
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/denyu"
    android:text="="
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

    <Button
        android:id="@+id/chuyu"
    android:text="/"
    android:textSize="26sp"
    android:layout_margin="5dp">
</Button>

</GridLayout>

  • 写回答

3条回答 默认 最新

  • allyfireshen 2023-03-18 16:48
    关注

    txt的定义重复了,且只初始化了oncreate中定义的,但是其他函数中使用的却是外层定义的txt,而外层的txt是没有初始化的,所以报错了,修改如下:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private  TextView txt;
        private  String firstNum = "";
        private  String operator = "";
        private  String secondNum = "";
        private  String result = "";
        private  String showText = "";
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 去掉重复定义
            txt =findViewById(R.id.tv01);
            // 其他代码不变
        }
        
        // 其他代码不变
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • lshen01 2023-03-18 16:44
    关注

    参考GPT和自己的思路:

    根据报错日志可以看到,在MainActivity.java文件的第105行处,引发了NullPointerException异常,这是因为尝试在一个null对象上调用了一个方法,也就是在null的TextView上调用了setText(java.lang.CharSequence)方法。

    根据代码可以看到,在onCreate()方法中,TextView txt已经被声明并赋值为findViewById(R.id.tv01)的返回值,但在后面的方法中,又声明了一个同名的局部变量TextView txt,并赋值为findViewById(R.id.tv01)的返回值,导致在refreshText()方法中,实际上使用的是一个null的局部变量txt。

    解决方法是将onCreate()方法中的声明TextView txt改为:txt = findViewById(R.id.tv01)。这样就不会再出现空指针异常了。

    评论
  • 追cium 2023-03-18 16:44
    关注

    参考GPT和自己的思路:

    根据报错日志,问题出在第105行,即:txt.setText(showText)。这个错误是由于在onCreate()方法中,你声明了一个局部变量TextView txt,覆盖了成员变量TextView txt,所以在refreshText()方法中调用成员变量TextView txt时,引用的是null值。解决方法是在onCreate()方法中修改TextView txt的声明,将TextView txt =findViewById(R.id.tv01)改为 txt = findViewById(R.id.tv01)。

    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 已采纳回答 3月18日
  • 创建了问题 3月18日

悬赏问题

  • ¥15 写出完整实验代码在codblocks中
  • ¥15 express连接mssql,每条额外附加了语句
  • ¥20 IQOO12如何有效ADB方法
  • ¥15 ios如何获取用户的订阅情况
  • ¥15 复杂表达式求值程序里的函数优先级问题
  • ¥15 求密码学的客成社记ji着用
  • ¥35 POI导入树状结构excle
  • ¥15 初学者c语言题目解答
  • ¥15 div editable中的光标问题
  • ¥15 mysql报错1415Not allowed to return a result set from a trigger 不知如何修改