所以我尝试比较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);
}
}
}
答案 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) {