我想要计算两个字段。如果我在两个字段中输入数字,程序工作正常,但如果我有一个空并按下我的“buttonSubtract”(计算按钮)它只关闭“应用程序关闭...”。为什么catch子句没有捕获异常?
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonSubtract = (Button) findViewById(R.id.buttonsubtract);
editTextNumber1 = (EditText) findViewById(R.id.textnumber1);
editTextNumber2 = (EditText) findViewById(R.id.textnumber2);
textSum = (TextView) findViewById(R.id.textViewSum);
try
buttonSubtract.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if (editTextNumber1.getText().toString() == ""
|| editTextNumber2.getText().toString() == "")
{
textSum.setText("Put numbers in both fields");
} else
{
int sum = Integer.parseInt(editTextNumber1.getText()
.toString())
- Integer.parseInt(editTextNumber2.getText()
.toString());
textSum.setText("sum: " + sum);
}
}
});
} catch (NumberFormatException e)
{
textSum.setText("Put numbers in both fields");
}
答案 0 :(得分:3)
您无法捕获从外部抛出内部类的异常。将try
/ catch
块移动到NumberFormatException
发生的位置。
buttonSubtract.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String number1 = editTextNumber1.getText().toString().trim();
String number2 = editTextNumber2.getText().toString().trim();
if (!number1.isEmpty() && !number2.isEmpty()) {
try {
int sum = Integer.parseInt(number1)
+ Integer.parseInt(number2);
textSum.setText("sum: " + sum);
return;
} catch (NumberFormatException e) {
// nothing to do
}
}
textSum.setText("Put numbers in both fields");
}
});
原因很简单:onClick
内执行的代码不会被您调用。一旦发生点击,系统就会调用它。例外仅传播给调用者。
看一下您是否重新安排代码更简单。您的代码等同于
OnClickListener someListener = getListener(); // this creates your implementation.
try {
buttonSubtract.setOnClickListener(someListener);
} catch (NumberFormatException e) {
// do stuff
}
答案 1 :(得分:2)
首先,始终将字符串与.equals()方法进行比较,==
运算符将检查两个引用变量是否指向/引用相同的对象:
if (editTextNumber1.getText().toString() == "" || editTextNumber2.getText().toString() == "")
应该是 如果(editTextNumber1.getText()。的toString()。等于( “”)|| editTextNumber2.getText()。的toString()。等于( “”))
或者更好的是,您可以使用String.isEmpty()来检查字符串是否为空。
现在,关于实际问题:
将try / catch移动到代码中,该代码为catch捕获异常抛出NumberFormatException。
try {
int sum = Integer.parseInt(editTextNumber1.getText().toString())
- Integer.parseInt(editTextNumber2.getText().toString());
textSum.setText("sum: " + sum);
}
catch(numberFormatException ex) {
//do the stuff
}
答案 2 :(得分:1)
您只有NumberFormatException的catch块。在块之前或其内部可能会抛出许多其他异常。例如,如果您在开头调用的任何findViewById()方法返回null,则对该变量的方法的任何调用都将抛出NullPointerException。
检查logCat以查看正在抛出的异常。
答案 3 :(得分:1)
您的OnClickListener实现中抛出的异常将被您的try..catch语句捕获,因为您只是创建它并设置为侦听器,但不执行。它将在稍后的其他线程中执行,删除它并将你的try..catch语句放在onclick方法中。
你在尝试之后忘记了一个“{”,你无法将字符串与==
进行比较,如果变量具有相同的对象,它们将进行比较,如果它们是等于的话。请改用equals(Object o)
方法,并检查它是否为空,最好修剪字符串并使用isEmpty()
方法"sample".trim().isEmpty()
buttonSubtract.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
try
{
if (editTextNumber1.getText().toString().trim().isEmpty()
|| editTextNumber2.getText().toString().trim().isEmpty())
{
textSum.setText("Put numbers in both fields");
} else
{
int sum = Integer.parseInt(editTextNumber1.getText()
.toString())
- Integer.parseInt(editTextNumber2.getText()
.toString());
textSum.setText("sum: " + sum);
}
} catch (NumberFormatException e)
{
textSum.setText("Put numbers in both fields");
}
}
});