Java 为什么应用程序关闭并且catch子句不存在´;你没发现错误吗?
我有两个字段要计算。如果我在两个字段中都输入数字,程序运行良好,但如果有一个字段为空,并按下“buttonSubtract”(计算按钮),程序将关闭,并显示“application closed…”。为什么catch子句不能捕获异常Java 为什么应用程序关闭并且catch子句不存在´;你没发现错误吗?,java,android,Java,Android,我有两个字段要计算。如果我在两个字段中都输入数字,程序运行良好,但如果有一个字段为空,并按下“buttonSubtract”(计算按钮),程序将关闭,并显示“application closed…”。为什么catch子句不能捕获异常 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mai
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");
}
首先,始终将字符串与.equals()方法进行比较,
=
运算符将检查两个引用变量是否指向/引用同一对象:
if (editTextNumber1.getText().toString() == "" || editTextNumber2.getText().toString() == "")
应该是
如果(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
}
只有NumberFormatException的catch块。许多其他异常可以在块之前或块内部抛出。例如,如果在开始时调用的任何findViewById()方法返回null,则对该变量的方法的任何调用都将抛出NullPointerException
检查logCat以查看抛出的异常。您无法捕获从外部在内部类中抛出的异常。将
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
}
OnClickListener实现中抛出的异常将被try..catch语句捕获,因为您只是创建它并将其设置为侦听器,而不是执行。稍后它将在其他线程中执行,删除该线程并将try..catch语句放入onclick方法中 另外,您在尝试后忘记了一个“{”,并且您无法将字符串与
==
进行比较,如果变量相等,它将比较变量是否具有相同的对象。请改用equals(Object o)
方法,要检查它是否为空,最好修剪字符串并使用isEmpty()
方法“sample.trim()).isEmpty()
有关异常的详细信息,请查看logcat,并将其添加到您的问题中。可能a
NullPointerException
?是否有stacktrace或logcat?@DaveG,我一定会调查的,谢谢。很抱歉,没有正确阅读下面的代码接受答案+1。尽管这是正确的,但比较不会引发异常,这就是问题b遇到错误。这只是两个指针之间的比较,总是返回false。我在外部有一个异常块,应该可以捕获所有内容。顺便问一下,logCat是什么?不,你没有。try/catch块只会捕获setOnClickListener()抛出的异常方法,而不是OnClickListener类本身内部的方法。该类的方法将在稍后执行,正如zapl所回答的那样,try/catch块应该位于OnClick()方法内部。Eclipse ADT插件包括一个用于查看应用程序日志的选项卡。
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");
}
}
});