首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么应用程序正在关闭,catch -子句没有捕捉到错误?

为什么应用程序正在关闭,catch -子句没有捕捉到错误?
EN

Stack Overflow用户
提问于 2012-12-06 03:28:01
回答 4查看 84关注 0票数 0

我有两个要计算的字段。如果我在两个字段都输入数字,程序运行良好,但如果我有一个空的,并按下我的"buttonSubtract“(计算按钮),它就会关闭,并显示”应用程序已关闭...“。为什么catch -子句没有捕捉到异常?

代码语言:javascript
复制
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");
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-06 03:34:14

您不能捕获从外部在内部类中抛出的异常。将try / catch块移动到发生NumberFormatException的位置。

代码语言:javascript
复制
    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中执行的代码不会被您调用。一旦点击发生,它就会被系统调用。异常仅传播到调用方。

如果稍微重新排列一下代码,就会更简单。您的代码等同于

代码语言:javascript
复制
OnClickListener someListener = getListener(); // this creates your implementation.
try {
    buttonSubtract.setOnClickListener(someListener);
} catch (NumberFormatException e) {
    // do stuff
}
票数 3
EN

Stack Overflow用户

发布于 2012-12-06 03:30:23

首先,总是用.equals()方法比较字符串,==操作符会检查两个引用变量是否指向/引用同一个对象:

代码语言:javascript
复制
if (editTextNumber1.getText().toString() == "" || editTextNumber2.getText().toString() == "")

应为if(editTextNumber1.getText().toString().equals("")||editTextNumber2.getText().toString().equals(""))

或者更好的是,您可以使用来检查字符串是否为空。

现在,关于实际问题:

在抛出NumberFormatException的代码中移动try/catch来捕获异常。

代码语言:javascript
复制
   try {    
       int sum = Integer.parseInt(editTextNumber1.getText().toString())
                            - Integer.parseInt(editTextNumber2.getText().toString());
       textSum.setText("sum: " + sum);
   }
   catch(numberFormatException ex) {
       //do the stuff
     }
票数 2
EN

Stack Overflow用户

发布于 2012-12-06 03:30:34

您只有一个用于NumberFormatException的catch块。可以在块之前或块内部抛出许多其他异常。例如,如果您在开头调用的任何findViewById()方法返回空值,则对该变量的任何方法的调用都将抛出NullPointerException。

检查logCat,看看抛出了什么异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13730910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档