I am unable to locate the error in my code that is leading to a NullPointerException. The app is designed to take input and send a String or URI to another Android device via NFC, but the App keeps crashing on startup.
On app startup, it says "The application keeps stopping".
It is also happening on my physical device.
Here is the log:
2020-12-11 06:03:08.580 8013-8013/com.example.messageswap E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.messageswap, PID: 8013
java.lang.RuntimeException: Unable to resume activity {com.example.messageswap/com.example.messageswap.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.messageswap.NFCManager.verifyNFC()' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4205)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4237)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.messageswap.NFCManager.verifyNFC()' on a null object reference
at com.example.messageswap.MainActivity.onResume(MainActivity.java:126)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1446)
at android.app.Activity.performResume(Activity.java:7939)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4195)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4237)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
The method call that is failing is set up as follows:
In NFCManager.java
:
public class NFCManager {
private Activity activity;
private NfcAdapter nfcAdpt;
public NFCManager(Activity activity) {
this.activity = activity;
}
public void verifyNFC() throws NFCNotSupported, NFCNotEnabled {
nfcAdpt = NfcAdapter.getDefaultAdapter(activity);
if (nfcAdpt == null)
throw new NFCNotSupported();
if (!nfcAdpt.isEnabled())
throw new NFCNotEnabled();
}
And it being called in MainActivity.java
:
@Override
protected void onResume() {
// Register android app to receive notification when the device is near NFC tag using
// foreground dispatch
super.onResume();
try {
nfcMger.verifyNFC();
Intent nfcIntent = new Intent(this, getClass());
nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, nfcIntent, 0);
IntentFilter[] intentFiltersArray = new IntentFilter[]{};
String[][] techList = new String[][]{
{android.nfc.tech.Ndef.class.getName()},
{android.nfc.tech.NdefFormatable.class.getName()}
};
NfcAdapter nfcAdpt = NfcAdapter.getDefaultAdapter(this);
nfcAdpt.enableForegroundDispatch(this, pendingIntent,
intentFiltersArray, techList);
} catch (NFCManager.NFCNotSupported nfcnsup) {
Snackbar.make(v, "NFC not supported", Snackbar.LENGTH_LONG).show();
} catch (NFCManager.NFCNotEnabled nfcnEn) {
Snackbar.make(v, "NFC Not enabled", Snackbar.LENGTH_LONG).show();
}
}
All I can think of is that the device is throwing an exception because, for some reason, it is unable to read any NFC tags nearby.
As I am not very familiar with Android development (Only started very recently), any help diagnosing the issue would be greatly appreciated.
Thank you in advance.