Java 为什么应用程序关闭并且catch子句不存在´;你没发现错误吗?

Java 为什么应用程序关闭并且catch子句不存在´;你没发现错误吗?,java,android,Java,Android,我有两个字段要计算。如果我在两个字段中都输入数字,程序运行良好,但如果有一个字段为空,并按下“buttonSubtract”(计算按钮),程序将关闭,并显示“application closed…”。为什么catch子句不能捕获异常 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mai

我有两个字段要计算。如果我在两个字段中都输入数字,程序运行良好,但如果有一个字段为空,并按下“buttonSubtract”(计算按钮),程序将关闭,并显示“application closed…”。为什么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");
    }

首先,始终将字符串与.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");
            }
        }
    });