EditText设置为空时崩溃应用程序(Android)

时间:2017-07-19 19:35:45

标签: java android

我有一个EditText,当我将其设置为Empty并单击我的按钮时,我的应用程序崩溃了。

当我在Android Monitor中查看它时,它指向以下行:

final int addTm = Integer.parseInt(Teaching);

这是我的代码:

的LinearLayout

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="2dp">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_weight="1"
                android:text="" />

            <EditText
                android:id="@+id/tM"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="24dp"
                android:layout_marginRight="50dp"
                android:ems="1"
                android:inputType="number"
                android:maxLength="1"
                android:text="0" />
           <Button
            android:id="@+id/submitBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Submit" />

        </LinearLayout>

我的Java代码:

Submit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            String Teaching = Tm.getText().toString();
            final int addTm = Integer.parseInt(Teaching);

            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("sub").child("TM");
            myRef.runTransaction(new Transaction.Handler() {
                @Override
                public Transaction.Result doTransaction(MutableData mutableData) {
                    Integer currentValue = mutableData.getValue(Integer.class);
                    if (currentValue == null) {
                        mutableData.setValue(0);
                    } else {
                        mutableData.setValue(currentValue + addTm);
                    }

                    return Transaction.success(mutableData);
                }

                @Override
                public void onComplete(DatabaseError databaseError, boolean committed, DataSnapshot dataSnapshot) {
                    System.out.println("Transaction completed");
                }

            });
         }
    });

2 个答案:

答案 0 :(得分:1)

其他答案都很好,但我建议用NumberFormatException的try / catch包装。我知道你的输入设置只接受数字,但总是比抱歉更安全。

小写String变量Teaching。在Java中,我们只有大写的Type名称。 (类,接口等)请注意StackOverflow如何突出显示变量教学蓝色,有点迷惑吗?

为您的会员字段以及Tm和Submit执行此操作。他们应该写下来并提交。此外,Tm也不是变量的描述性名称。想象一下,另一位程序员进来看着你的代码,并想知道什么是tm。这个tm的背景是什么,它来自哪里......它做了什么?它是一个少年突变者吗?

无论何时使用Integer.parseInt将其包装在try / catch:

    @Override
    public void onClick(View view){

        final int addTm;
        try {
            String teaching = Tm.getText().toString();
            addTm = Integer.parseInt(teaching);
        } catch (NumberFormatException e) {
            addTm = 0;
        }

        // ...
    }

你为什么要这样做?如果我在您的号码输入中输入十进制数怎么办?

使用您接受的答案,您仍然会崩溃。 Integer.parseInt不会解析十进制数。

或者,如果我切换设备的区域设置并输入一个Integer.parseInt不期望的奇数字符的数字,那该怎么样。

要抓住该异常才能完全证明。

答案 1 :(得分:0)

在空字符串throws an NumberFormatException上执行Integer.parseInt()时。

首先,检查Teaching的值,并确认它不是空字符串,或者 - {for {catch} NumberFormatException,并为Teaching设置所需的值在那种情况下。