2017-07-19 95 views
1

我有一个EditText,当我将它设置为Empty并单击我的按钮时,我的应用程序崩溃。EditText当它设置为空时崩溃应用程序(Android)

当我在Android的监视器查看它所指向的行:

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

      }); 
     } 
    }); 
+0

这不是'firebase'问题,所以请删除这个标签,并且你得到这个错误,因为默认情况下'EditText'返回一个空字符串,不能'解析'为'integer'。执行一些异常处理,你很好去! – Dennis

回答

1

其他答案是好的,但我建议包装与NumberFormatException try/catch。我知道你的输入只能接受数字,但总是比对不起更安全。

小写字符串变量教学。在Java中,我们只有大写的类型名称。 (类,接口等)注意StackOverflow如何突出显示变量Teaching blue,有点迷失方向?

为您的成员字段以及Tm和提交做到这一点。他们应该被写下并提交。另外,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将不会指望。

要抓住这个例外来充分证明。

+0

谢谢你给我这么多的知识。我是Android级别的初学者。而Tm是教学方法! – PrincE

0

执行时Integer.parseInt()上一个空字符串它throws an NumberFormatException

首先,检查Teaching的值,并验证它不是空字符串,或者 - 尝试/ catch为NumberFormatException,并在此情况下为Teaching设置所需的值。

相关问题