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>
问题分析与修复
核心问题
- Log调用参数错误:
Log.i(thesearchnumber, "thesearchnumber");中,第一个参数是日志标签,Android要求标签不能为空字符串。若EditText未输入内容,thesearchnumber为空,会触发IllegalArgumentException导致崩溃。 - 未处理空输入:没有对EditText的空输入做判断,直接传入Setter方法,可能引发后续逻辑问题。
- 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
相关产品推荐
相关产品推荐

