You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Getter/Setter(访问器/修改器)调用触发致命异常求助

Android Getter/Setter调用触发致命异常问题

问题背景

点击Android应用的sendToSetter按钮,尝试将EditText中的数字传入Setter方法时触发致命异常,无法正常运行,期望实现EditText参数正常传入Getter/Setter方法。

报错日志

V/Toast: Toast SHOW: android.widget.Toast@13d7808 view = null pkg: com.example.gettersettertest TextToast? true caller: com.example.gettersettertest.MainActivity$1.onClick:34 android.view.View.performClick:7503 com.google.android.material.button.MaterialButton.performClick:1202 android.view.View.performClickInternal:7480 android.view.View.access$3600:813 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main

相关代码

MainActivity.java

package com.example.gettersettertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity{

Button BTN_sendToSetter, BTN_getFromGetter;
EditText EditNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BTN_sendToSetter = findViewById(R.id.BTN_sendToSetter);
        BTN_getFromGetter = findViewById(R.id.BTN_getFromGetter);
        EditNumber = findViewById(R.id.EditNumber);


            BTN_sendToSetter.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v)
                {
                    Toast.makeText(getApplicationContext(), "SetButtonworking:", Toast.LENGTH_SHORT).show();

                    String thesearchnumber = EditNumber.getText().toString();
                    Log.i(thesearchnumber, "thesearchnumber");
                    Toast.makeText(getApplicationContext(), "searchnumber:" + thesearchnumber , Toast.LENGTH_SHORT).show();

                    //everything working so far. Try  getter and setter
                    SearchNumber obj = new SearchNumber();

                    obj.setSearchNumber(thesearchnumber);
                    String objRet = obj.getSearchNumber();
                    Toast.makeText(getApplicationContext(), "searchnumberOBJ" + objRet , Toast.LENGTH_SHORT).show();
                }


        });

            BTN_getFromGetter.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view) {
                    Toast.makeText(getApplicationContext(), "GetButtonWorking:", Toast.LENGTH_SHORT).show();
                }
            });
}
}

SearchNumber.java

package com.example.gettersettertest;


import android.util.Log;
import java.io.*;

public class SearchNumber{
    private String mSearchNumber;


    //no constructor


    // getter and setter
    public String getSearchNumber() { //The get method returns the value of the variable.
        Log.i("GET SearchNumber  is " , mSearchNumber);
        return mSearchNumber;

    }

    public void setSearchNumber(String sentSearchNumber) { //The set method takes a parameter  and assigns it to the name variable. The this keyword is used to refer to the current object.
        Log.i("setSearchNumber  is " , mSearchNumber);
        this.mSearchNumber = sentSearchNumber; //this instance refers to the current instance itself
        Log.i("setSearchNumber  is " , mSearchNumber);
    }
// getter and setter end
}

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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/BTN_getFromGetter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:text="getFromGetter"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="33dp" />

    <Button
        android:id="@+id/BTN_sendToSetter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:text="sendToSetter"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@id/BTN_getFromGetter"
        tools:layout_editor_absoluteX="244dp" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="55dp"
        android:hint="hinthere"
        android:text="TextView"
        app:layout_constraintTop_toBottomOf="@+id/BTN_getFromGetter"
        tools:layout_editor_absoluteX="174dp" />

    <EditText
        android:id="@+id/EditNumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:hint="ID: editNumber"
        android:inputType="number"
        app:layout_constraintTop_toBottomOf="@+id/textView1"
        tools:layout_editor_absoluteX="174dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

问题分析与修复

核心问题

  1. Log调用参数错误:Log.i(thesearchnumber, "thesearchnumber");中,第一个参数是日志标签,Android要求标签不能为空字符串。若EditText未输入内容,thesearchnumber为空,会触发IllegalArgumentException导致崩溃。
  2. 未处理空输入:没有对EditText的空输入做判断,直接传入Setter方法,可能引发后续逻辑问题。
  3. Log输出不规范:SearchNumber类的set方法中,首次输出mSearchNumber时该变量未初始化(值为null),虽不直接崩溃,但日志可读性差。

修复方案

1. 修正MainActivity的Log调用与空输入判断

修改按钮点击事件中的代码:

BTN_sendToSetter.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v)
    {
        Toast.makeText(getApplicationContext(), "SetButtonworking:", Toast.LENGTH_SHORT).show();

        String thesearchnumber = EditNumber.getText().toString().trim();
        // 空输入判断
        if (thesearchnumber.isEmpty()) {
            Toast.makeText(getApplicationContext(), "请输入数字", Toast.LENGTH_SHORT).show();
            return;
        }
        // 修正Log标签与内容顺序
        Log.i("MainActivity", "thesearchnumber: " + thesearchnumber);
        Toast.makeText(getApplicationContext(), "searchnumber:" + thesearchnumber , Toast.LENGTH_SHORT).show();

        SearchNumber obj = new SearchNumber();
        obj.setSearchNumber(thesearchnumber);
        String objRet = obj.getSearchNumber();
        Toast.makeText(getApplicationContext(), "searchnumberOBJ: " + objRet , Toast.LENGTH_SHORT).show();
    }
});

2. 规范SearchNumber类的Log输出

修改Getter/Setter中的Log代码:

public String getSearchNumber() {
    Log.i("SearchNumber", "GET SearchNumber is: " + mSearchNumber);
    return mSearchNumber;
}

public void setSearchNumber(String sentSearchNumber) {
    // 处理未初始化的null情况
    Log.i("SearchNumber", "setSearchNumber before: " + (mSearchNumber == null ? "null" : mSearchNumber));
    this.mSearchNumber = sentSearchNumber;
    Log.i("SearchNumber", "setSearchNumber after: " + mSearchNumber);
}

内容的提问来源于stack exchange,提问作者Tim W Newark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:47:11