我得到NullPointerException当我尝试比较数据库中的值和编辑文本输入时

时间:2017-04-27 16:03:55

标签: java android firebase nullpointerexception android-edittext

所以我尝试比较2个值,一个是来自Firebase的“coinAmount”,它是一个Long值,一个是EditText输入(它是一个String)。

基本上我想要实现的是,如果输入超过用户的硬币金额,我想显示警告。

        String coinAmount = coinWrapper.getEditText().getText().toString();

        if (Long.parseLong(coinAmount) >= coinValue) {

          Toast.makeText(getApplicationContext(), "You don't have enough coins!",
              Toast.LENGTH_SHORT).show();
        } else {

          Intent intent = new Intent(getActivity(), FriendActivity.class);
          intent.putExtra("coin", coinAmount);
          intent.putExtra("choice", choice);
          startActivity(intent);
        }

我将用户输入作为String的原因是因为我稍后将该值显示为文本,所以在我比较时我将其解析为Long。 但是,当我运行应用程序时,我得到了这个NullPointerException:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: ege.mevzubahis, PID: 13369
java.lang.NullPointerException
    at ege.mevzubahis.Fragments.BetsDialogFragment.onClick(BetsDialogFragment.java:135)
    at ege.mevzubahis.Fragments.BetsDialogFragment_ViewBinding$4.doClick(BetsDialogFragment_ViewBinding.java:70)
    at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
    at android.view.View.performClick(View.java:4478)
    at android.view.View$PerformClick.run(View.java:18698)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:149)
    at android.app.ActivityThread.main(ActivityThread.java:5257)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
    at dalvik.system.NativeStart.main(Native Method)

以下是我尝试从Firebase获取coinAmount的部分:

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    userID=sharedPreferences.getString("userIDKey",null);


    mDatabase.child("Users").child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {

        coinValue = (Long) dataSnapshot.child("coin").getValue();

      }

      @Override
      public void onCancelled(DatabaseError databaseError) {

        //Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

      }
    });

错误在这部分:

if (Long.parseLong(coinAmount) >= coinValue) {

完整代码

public class BetsDialogFragment extends DialogFragment implements View.OnClickListener {

  @BindView(R.id.tv_match) TextView tv_match;
  @BindView(R.id.textView2) TextView textView2;
  @BindView(R.id.textInputLayout) TextInputLayout textInputLayout;
  @BindView(R.id.radioButton4) RadioButton radioButton4;
  @BindView(R.id.radioButton5) RadioButton radioButton5;
  @BindView(R.id.radioButton6) RadioButton radioButton6;
  @BindView(R.id.button2) Button sendButton;

  String matchName;
  private DatabaseReference mDatabase;
  private RadioGroup radioGroup;
  private String choice;
  private EditText editText;
  private TextInputLayout coinWrapper;
  public Long coinValue;

  SharedPreferences sharedPreferences;
  private String userID;

  @Nullable @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
      Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.custom_dialog, null);
    matchName = getArguments().getString("betNameInPosition");
    mDatabase = FirebaseDatabase.getInstance().getReference();
    radioGroup = (RadioGroup) view.findViewById(R.id.radioGroup);
    editText = (EditText) view.findViewById(R.id.editText);
    coinWrapper = (TextInputLayout) view.findViewById(R.id.textInputLayout);
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    userID=sharedPreferences.getString("userIDKey",null);


    mDatabase.child("Users").child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {

        coinValue = (Long) dataSnapshot.child("coin").getValue();

        Log.v("coin value: ", coinValue.toString());

      }

      @Override
      public void onCancelled(DatabaseError databaseError) {

        //Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

      }
    });

    mDatabase.child("Bets")
        .child("Sports")
        .child(matchName)
        .addListenerForSingleValueEvent(new ValueEventListener() {
          @Override public void onDataChange(DataSnapshot dataSnapshot) {
            try {
              Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
              String value = (String) map.get("matchname").toString();
              tv_match.setText(value);
              String durationValue = (String) map.get("duration").toString();
              textView2.setText("Due to: " + durationValue);

              coinValue = (Long) dataSnapshot.child("coin").getValue();
            } catch (Throwable t) {
              Log.e("trycatchFAIL", "b");
            }
          }

          @Override public void onCancelled(DatabaseError databaseError) {

          }
        });

    ButterKnife.bind(this, view);
    return view;
  }

  @OnClick({ R.id.radioButton4, R.id.radioButton5, R.id.radioButton6})
  public void onClick(View view) {

    switch (view.getId()) {
      case R.id.radioButton4:
        choice = "home";
        Toast.makeText(getApplicationContext(), "choice: Home", Toast.LENGTH_SHORT).show();
        break;
      case R.id.radioButton5:
        choice = "draw";
        Toast.makeText(getApplicationContext(), "choice: Draw", Toast.LENGTH_SHORT).show();
        break;
      case R.id.radioButton6:
        choice = "away";
        Toast.makeText(getApplicationContext(), "choice: Away", Toast.LENGTH_SHORT).show();
        break;

    }
  }

  @OnClick(R.id.button2)
  public void onClickSendButton(View view){
    String coinAmount = coinWrapper.getEditText().getText().toString();

    Log.v("coinAmount",coinAmount);

    if (Long.parseLong(coinAmount) >= coinValue) {

      Toast.makeText(getApplicationContext(), "You don't have enough coins!",
          Toast.LENGTH_SHORT).show();
    } else {

      Intent intent = new Intent(getActivity(), FriendActivity.class);
      intent.putExtra("coin", coinAmount);
      intent.putExtra("choice", choice);
      startActivity(intent);
    }


  }
}

2 个答案:

答案 0 :(得分:2)

if (Long.parseLong(coinAmount) >= coinValue).  

有问题:
如果coinAmount为null,则抛出java.lang.NumberFormatException:null 所以看起来coinValue为null 因为使用&#34; >=&#34;,Java会尝试更改Long - &gt; long。如果该项为null,则jvm将抛出java.lang.NullPointerException

答案 1 :(得分:1)

如果你在那里得到一个NullPointer,你也应该在这里得到一个NullPointer。

   coinValue = (Long) dataSnapshot.child("coin").getValue();

   Log.v("coin value: ", coinValue.toString());

所以,问题是Firebase没有给你任何回报,或者你之前点击了它。

一种解决方案是在您自己取消装箱Long对象时进行空检查。

long _coinValue = if (coinValue == null) ? 0 : coinValue.longValue(); 

if (Long.parseLong(coinAmount) >= _coinValue) {