尝试在空对象引用 NFC 上调用虚拟方法 'boolean java.lang.String.equals(java.lang.Object)'
Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference NFC
我在创建 nfc reader 应用程序时遇到此错误。当我 运行 启动器 activity 的应用程序是读取 nfc 标签的应用程序时,一切正常,但是当我使用另一个 activity 作为启动器 activity 时,单击一个按钮打开 nfc 读取 activity 应用程序因错误而崩溃。这是我的代码
private NfcAdapter mNfcAdapter;
private IntentFilter[] mTagFilters;
private PendingIntent mNfcPendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP), 0);
IntentFilter ndefDiscovery = new IntentFilter(
NfcAdapter.ACTION_NDEF_DISCOVERED);
IntentFilter tagDiscovery = new IntentFilter(
NfcAdapter.ACTION_TAG_DISCOVERED);
mTagFilters = new IntentFilter[]{ ndefDiscovery, tagDiscovery };
readTag(getIntent());
}
@Override
protected void onResume() {
super.onResume();
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent,
mTagFilters, null);
} else {
Toast.makeText(this, "Sorry, No NFC Adapter found.",
Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPause() {
super.onPause();
if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
readTag(intent);
}
private void readTag(Intent intent) {
if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || intent.getAction()
.equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
findViewById(R.id.progress).setVisibility(View.GONE);
// Validate that this tag can be read
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
// Check to see if tag is writeable
boolean writeable = writableTag(detectedTag);
TextView writeableText = (TextView) findViewById(R.id.tag_writeable);
writeableText.setText("Writeable? " + (writeable ? "Yes" : "No"));
Ndef ndef = Ndef.get(detectedTag);
if (ndef != null) {
try {
ndef.connect();
int maxSize = ndef.getMaxSize();
TextView infoText = (TextView) findViewById(R.id.tag_content);
TextView maxSizeText = (TextView) findViewById(R.id.tag_max_size);
maxSizeText.setText("Tag capacity: " + maxSize + " bytes");
TextView remainingSizeText = (TextView) findViewById(R.id
.tag_remaining_size);
NdefMessage message = ndef.getNdefMessage();
if (message != null) {
NdefRecord[] records = message.getRecords();
StringBuilder sb = new StringBuilder();
for (NdefRecord record : records) {
String payload = new String(record.getPayload(), "UTF-8");
sb.append(payload + "\n");
}
String regNum = sb.toString().substring(3);
infoText.setText(regNum);
infoText.setTextColor(Color.BLACK);
//Intent intentProfile = new Intent(MainActivity.this, ProfileActivity.class);
//intentProfile.putExtra("id",regNum);
//startActivity(intentProfile);
remainingSizeText.setText("Remaining capacity: " + (maxSize - message
.getByteArrayLength()) + " bytes");
} else {
infoText.setText("Empty tag");
infoText.setTextColor(Color.RED);
remainingSizeText.setText("Remaining capacity: " + maxSize + " bytes");
}
} catch (IOException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
} finally {
try {
// Important if you want to use detectedTag later
ndef.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private boolean writableTag(Tag tag) {
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
ndef.close();
return false;
}
ndef.close();
return true;
}
} catch (Exception e) {
Toast.makeText(this, "Failed to read tag", Toast.LENGTH_SHORT)
.show();
}
return false;
}
这是完整的日志
Process: tino.varconn.nfccheckin, PID: 6047
java.lang.RuntimeException: Unable to start activity ComponentInfo{tino.varconn.nfccheckin/tino.varconn.nfccheckin.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3403)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3587)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2185)
at android.os.Handler.dispatchMessage(Handler.java:112)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7593)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at tino.varconn.nfccheckin.MainActivity.readTag(MainActivity.java:78)
at tino.varconn.nfccheckin.MainActivity.onCreate(MainActivity.java:49)
at android.app.Activity.performCreate(Activity.java:7458)
at android.app.Activity.performCreate(Activity.java:7448)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3382)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3587)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2185)
at android.os.Handler.dispatchMessage(Handler.java:112)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7593)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
请评论 readTag(getIntent())
来自 onCreate(
) 方法并检查
将 if 语句更改为
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TAG_DISCOVERED.equlas(intent.getAction()))
因为null.equlas("somthing")
会产生NPE但something.equlas(null)
不会。
我在创建 nfc reader 应用程序时遇到此错误。当我 运行 启动器 activity 的应用程序是读取 nfc 标签的应用程序时,一切正常,但是当我使用另一个 activity 作为启动器 activity 时,单击一个按钮打开 nfc 读取 activity 应用程序因错误而崩溃。这是我的代码
private NfcAdapter mNfcAdapter;
private IntentFilter[] mTagFilters;
private PendingIntent mNfcPendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP), 0);
IntentFilter ndefDiscovery = new IntentFilter(
NfcAdapter.ACTION_NDEF_DISCOVERED);
IntentFilter tagDiscovery = new IntentFilter(
NfcAdapter.ACTION_TAG_DISCOVERED);
mTagFilters = new IntentFilter[]{ ndefDiscovery, tagDiscovery };
readTag(getIntent());
}
@Override
protected void onResume() {
super.onResume();
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent,
mTagFilters, null);
} else {
Toast.makeText(this, "Sorry, No NFC Adapter found.",
Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPause() {
super.onPause();
if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
readTag(intent);
}
private void readTag(Intent intent) {
if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || intent.getAction()
.equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
findViewById(R.id.progress).setVisibility(View.GONE);
// Validate that this tag can be read
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
// Check to see if tag is writeable
boolean writeable = writableTag(detectedTag);
TextView writeableText = (TextView) findViewById(R.id.tag_writeable);
writeableText.setText("Writeable? " + (writeable ? "Yes" : "No"));
Ndef ndef = Ndef.get(detectedTag);
if (ndef != null) {
try {
ndef.connect();
int maxSize = ndef.getMaxSize();
TextView infoText = (TextView) findViewById(R.id.tag_content);
TextView maxSizeText = (TextView) findViewById(R.id.tag_max_size);
maxSizeText.setText("Tag capacity: " + maxSize + " bytes");
TextView remainingSizeText = (TextView) findViewById(R.id
.tag_remaining_size);
NdefMessage message = ndef.getNdefMessage();
if (message != null) {
NdefRecord[] records = message.getRecords();
StringBuilder sb = new StringBuilder();
for (NdefRecord record : records) {
String payload = new String(record.getPayload(), "UTF-8");
sb.append(payload + "\n");
}
String regNum = sb.toString().substring(3);
infoText.setText(regNum);
infoText.setTextColor(Color.BLACK);
//Intent intentProfile = new Intent(MainActivity.this, ProfileActivity.class);
//intentProfile.putExtra("id",regNum);
//startActivity(intentProfile);
remainingSizeText.setText("Remaining capacity: " + (maxSize - message
.getByteArrayLength()) + " bytes");
} else {
infoText.setText("Empty tag");
infoText.setTextColor(Color.RED);
remainingSizeText.setText("Remaining capacity: " + maxSize + " bytes");
}
} catch (IOException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
} finally {
try {
// Important if you want to use detectedTag later
ndef.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private boolean writableTag(Tag tag) {
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
ndef.close();
return false;
}
ndef.close();
return true;
}
} catch (Exception e) {
Toast.makeText(this, "Failed to read tag", Toast.LENGTH_SHORT)
.show();
}
return false;
}
这是完整的日志
Process: tino.varconn.nfccheckin, PID: 6047
java.lang.RuntimeException: Unable to start activity ComponentInfo{tino.varconn.nfccheckin/tino.varconn.nfccheckin.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3403)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3587)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2185)
at android.os.Handler.dispatchMessage(Handler.java:112)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7593)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at tino.varconn.nfccheckin.MainActivity.readTag(MainActivity.java:78)
at tino.varconn.nfccheckin.MainActivity.onCreate(MainActivity.java:49)
at android.app.Activity.performCreate(Activity.java:7458)
at android.app.Activity.performCreate(Activity.java:7448)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3382)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3587)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2185)
at android.os.Handler.dispatchMessage(Handler.java:112)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7593)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
请评论 readTag(getIntent())
来自 onCreate(
) 方法并检查
将 if 语句更改为
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TAG_DISCOVERED.equlas(intent.getAction()))
因为null.equlas("somthing")
会产生NPE但something.equlas(null)
不会。