java - 如何从 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);
解决方案
所以你必须小心在一个潜在的空对象上调用“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 中输入,但它会非常接近,所以希望这会对您有所帮助。
祝你好运,希望这些选项之一能很好地满足您的需求。
快乐编码。
推荐阅读
- heroku - 对爱好和专业的 Heroku 定价感到困惑(标准 1x)
- javascript - 有没有办法避免在我的代码中使用 forceupdate ?
- ruby-on-rails - 猴子如何修补动作文本的表单助手以排除活动存储依赖关系?
- react-native - React Native onPress 事件返回未定义
- java - 如何在 Android 中使用 OkHttp 缓存 Jsoup 请求
- reactjs - 反应钩子。更新组件在其中一个道具更改后通过 onClick 作为参数传递
- arrays - 如何在 Swift 中的视图中临时存储数据数组和对象
- sql - 当您的数据在列中为空时,Big Query 过滤器出现问题
- r - 右对齐 gt 中的 rowname_col
- arrays - 使用 importrange 从不同的工作表中提取文本和特定文本的计数