0

計算したいフィールドが2つあります。両方のフィールドに数値を入力するとプログラムは正常に動作しますが、一方が空で「buttonSubtract」(calc-button) を押すと、「アプリケーションが閉じられました...」というメッセージが表示されてシャットダウンします。catch-clause が例外をキャッチしないのはなぜですか?

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

4 に答える 4

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
}
于 2012-12-05T19:34:13.950 に答える
2

まず、常に文字列を .equals() メソッドと比較します。==演算子は、2 つの参照変数が同じオブジェクトを指している/参照しているかどうかを確認します。

if (editTextNumber1.getText().toString() == "" || editTextNumber2.getText().toString() == "")

if(editTextNumber1.getText().toString().equals("")||editTextNumber2.getText().toString().equals("")) にする必要があります

または、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
     }
于 2012-12-05T19:30:22.717 に答える
1

NumberFormatException の catch ブロックしかありません。ブロックの前または内部で、他の多くの例外がスローされる可能性があります。たとえば、最初に呼び出す findViewById() メソッドのいずれかが null を返す場合、その変数のメソッドを呼び出すと NullPointerException がスローされます。

logCat をチェックして、スローされている例外を確認します。

于 2012-12-05T19:30:34.053 に答える
1

OnClickListener 実装でスローされた例外は、try..catch ステートメントによってキャッチされます。これは、作成してリスナーとして設定しているだけで、実行していないためです。後で他のスレッドで実行されます。それを削除して、try..catch ステートメントを onclick メソッド内に配置します。

また、try の後に "{" を忘れてしまい、文字列を と比較することはできません==。変数が等しいかどうかではなく、同じオブジェクトを持っているかどうかを比較します。代わりにメソッドを使用し、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");
            }
        }
    });
于 2012-12-05T19:42:13.560 に答える