为什么app关闭而catch-clause没有捕获错误?

时间:2012-12-05 19:28:01

标签: java android

我想要计算两个字段。如果我在两个字段中输入数字,程序工作正常,但如果我有一个空并按下我的“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");
    }

4 个答案:

答案 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");
            }
        }
    });