首页 > 解决方案 > 如何从 EditText 检查 NullPointerException

问题描述

我想计算平均成绩,现在我有了基础知识和布局。当EditText它保持打开状态时,它会抛出一个NullPointerException,我知道它是什么,但不知道如何用我的代码检查/处理它。有人可以解释我该怎么做吗?

欢迎任何提示等!

final TextView averageView = findViewById(R.id.averageView); 
final String averageText = getString(R.string.average); 
final Button calculateButton = findViewById(R.id.calculateAverageButton); 
final Button addGradeButton = findViewById(R.id.addGradeButton)

calaculateButton.setOnClickListener(new View.onClickListener() { 
    @SupressLint("SetTextI18n")                                                     
    public void onClick(View v) { 

        double grade[]  = {Double.parseDouble(((EditText) findViewById(R.id.grade1)).getText().toString()); 

        double weight[] = {Double.parseDouble(((EditText) findViewById(R.id.weight1)).getText().toString()); 

        double weightTotal = weight[0]; double sum = grade[0] * weight[0] 

        double average = sum / weightTotal 

        @SuppressLint("DefaultLocale") String averageResult = String.format(%.2f, average);

        averageView.setText(averageText + " " + averageResult);

标签: javaandroidnullpointerexceptionandroid-edittext

解决方案


所以你必须小心在一个潜在的空对象上调用“toString()”。

特别是如果您打算将其转换为双倍。

注意*您的代码还会从 EditText 中的单个条目创建一个双精度数组,因此在转换之前还应该对文本格式进行额外检查,以确保它是双精度。您可以采取惰性方式并将其包装在 try/catch 中,告诉他们如果您愿意,它的格式不正确。

处理数字格式异常意味着您需要在使用它之前确认它是双精度数。您可以使用一个不错的实用程序,也可以编写一个简单的辅助方法。Guava 有辅助方法,Apache 有辅助方法,或者您可以像这里一样编写正则表达式模式匹配器。regex 的好处是您不依赖于 try/catch 来识别问题。

如何检查字符串是否可解析为双精度字符串?

但为了彻底起见,您可以执行以下操作:

private boolean isDouble(String value) {
    try {
        Double.parseDouble(value);
        return true;
    } catch (Exception ex) {
        return false;
    }
}

您有几个选项来处理您的空值。

1) 在“if / else”语句中检查 null。

double grade[];
if (myText.getText() != null && isDouble(myText.getText().toString()) {
    grade = {Double.parseDouble(myText.getText().toString())}
} else {
    //it's null, don't use it
}

2)检查空内联

if (isDouble(myText.getText().toString()) {
    double grade[] = myText.getText() == null ? {0.0, 0.0} : {Double.parseDouble(myText.getText().toString())}
}

3) 允许 null 作为选项

double grade[] = myText.getText() == null ? null : {Double.parseDouble(myText.getText().toString())}

4) 作弊并使用 Try/Catch(如果您不想掌握最好的处理方式,并且只想确保它不会崩溃并且您可以通知用户数据格式问题,您可以简单地在所有代码周围包装一个 Try/Catch 并每次都说“格式不正确”,但这不是很有描述性,可能还不够有用,仅供参考。

5) 或者,如果您愿意使用 Kotlin,您可以为每个方法制作出色的扩展方法。

fun EditText.doubleArrayOrDefault(): ArrayList<Double> {
      return if (this.getText() != null && isDouble(myText.getText().toString())) {
            {Double.parseDouble(myText.getText().toString())}
      } else {
            {0.0, 0.0} // or whatever you want your default to be
      }
 }

6) 最后,您可以简单地使用 DataBinding,这始终是我个人的偏好。更新您的 gradle 以启用 DataBining 并接受这是自切片中断以来发生的最伟大的事情的必然性;)。

在您将拥有的活动中

var myObservabeText: ObservableField<String> = ObservableField("defaultTextIfAny")

在 onCreate 你会设置变量

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_my)
    mBinding.activity = this
}

在 XML 中,您会将其更新为

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

    <data>
        <variable name="activity" type="com.package.a35.activities.MyActivity" />
    </data>

     <EditText
        android:id="@+id/myText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@={activity.myObservableText}" />

当然,如果您想编写一个非常简单的漂亮适配器,您也可以将 JVMStatic 添加到适配器以处理绑定到双精度数组。

当然,这都是伪的,并没有在实际的 IDE 中输入,但它会非常接近,所以希望这会对您有所帮助。

祝你好运,希望这些选项之一能很好地满足您的需求。

快乐编码。


推荐阅读