我有两个要计算的字段。如果我在两个字段都输入数字,程序运行良好,但如果我有一个空的,并按下我的"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");
}发布于 2012-12-06 03:34:14
您不能捕获从外部在内部类中抛出的异常。将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
}发布于 2012-12-06 03:30:23
首先,总是用.equals()方法比较字符串,==操作符会检查两个引用变量是否指向/引用同一个对象:
if (editTextNumber1.getText().toString() == "" || editTextNumber2.getText().toString() == "")应为if(editTextNumber1.getText().toString().equals("")||editTextNumber2.getText().toString().equals(""))
或者更好的是,您可以使用来检查字符串是否为空。
现在,关于实际问题:
在抛出NumberFormatException的代码中移动try/catch来捕获异常。
try {
int sum = Integer.parseInt(editTextNumber1.getText().toString())
- Integer.parseInt(editTextNumber2.getText().toString());
textSum.setText("sum: " + sum);
}
catch(numberFormatException ex) {
//do the stuff
}发布于 2012-12-06 03:30:34
您只有一个用于NumberFormatException的catch块。可以在块之前或块内部抛出许多其他异常。例如,如果您在开头调用的任何findViewById()方法返回空值,则对该变量的任何方法的调用都将抛出NullPointerException。
检查logCat,看看抛出了什么异常。
https://stackoverflow.com/questions/13730910
复制相似问题