在上下文中获取 NullPointerException
Getting NullPointerException in context
我想 运行 Android Studio 中的程序,但出现此错误。
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:152)
at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)
at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:224)
at android.app.AlertDialog$Builder.<init>(AlertDialog.java:454)
at com.example.drowzy.LivePreviewActivity.drowzy_alert(LivePreviewActivity.java:219)
at com.example.drowzy.LivePreviewActivity.eye_tracking(LivePreviewActivity.java:212)
at com.example.drowzy.FaceDetectionProcessor.onSuccess(FaceDetectionProcessor.java:90)
at com.example.drowzy.FaceDetectionProcessor.onSuccess(FaceDetectionProcessor.java:38)
at com.example.drowzy.VisionProcessorBase.onSuccess(VisionProcessorBase.java:114)
at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:251)
at android.app.ActivityThread.main(ActivityThread.java:6572)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
它说我的上下文为空。我已经在 google 中尝试了可能的解决方案,但它不起作用。我初始化上下文的方式是否错误?我可以在 FaceDetectionProcessor 中没有指定上下文的情况下在另一个 class 中调用 drowzy_alert 方法吗?
这是我的 LivePreviewActivity
public void eye_tracking(@NonNull FirebaseVisionFace face){
if (face.getRightEyeOpenProbability() < 0.1 && face.getLeftEyeOpenProbability() < 0.1) {
drowzy_alert();
}
}
public void drowzy_alert(){
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Drowzy Detected")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// FIRE ZE MISSILES!
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
builder.create();
}
这是我的 FaceDetectionProcessor
protected void onSuccess(
@Nullable Bitmap originalCameraImage,
@NonNull List<FirebaseVisionFace> faces,
@NonNull FrameMetadata frameMetadata,
@NonNull GraphicOverlay graphicOverlay
) {
graphicOverlay.clear();
if (originalCameraImage != null) {
CameraImageGraphic imageGraphic = new CameraImageGraphic(graphicOverlay, originalCameraImage);
graphicOverlay.add(imageGraphic);
}
for (int i = 0; i < faces.size(); ++i) {
FirebaseVisionFace face = faces.get(i);
int cameraFacing =
frameMetadata != null ? frameMetadata.getCameraFacing() :
Camera.CameraInfo.CAMERA_FACING_BACK;
FaceGraphic faceGraphic = new FaceGraphic(graphicOverlay, face, cameraFacing);
LivePreviewActivity livePreviewActivity = new LivePreviewActivity();
graphicOverlay.add(faceGraphic);
livePreviewActivity.eye_tracking(face);
}
graphicOverlay.postInvalidate();
}
LivePreviewActivity livePreviewActivity = new LivePreviewActivity();
您不能以这种方式实例化 LivePreviewActivity。如果您有 activity,则只能使用 startActivity 或由 android 管理的其他上下文方法。
整个想法是,每当您使用 activity 时,activity 应该位于 activity 堆栈的顶部(即对您的用户可见)并且 startActivity 会这样做你。它还在您的活动中传递应用程序和 activity 上下文,应用程序需要这些上下文来了解应用程序和设备的状态。如果没有此上下文,应用程序将无法运行。
您的 activity 需要位于堆栈顶部的原因是,一旦 activity 不再位于堆栈顶部,它可以被 android 杀死在任何时候都可以节省内存,您无法采取任何措施来防止这种行为。您可以对 activity 被杀做出反应,但不能超过此数。
据我所知,您必须将所有这些逻辑移动到一个 activity 而不是将其分成两个。如果您确实想同时加载多个活动,请考虑改用片段。
我想 运行 Android Studio 中的程序,但出现此错误。
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:152)
at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)
at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:224)
at android.app.AlertDialog$Builder.<init>(AlertDialog.java:454)
at com.example.drowzy.LivePreviewActivity.drowzy_alert(LivePreviewActivity.java:219)
at com.example.drowzy.LivePreviewActivity.eye_tracking(LivePreviewActivity.java:212)
at com.example.drowzy.FaceDetectionProcessor.onSuccess(FaceDetectionProcessor.java:90)
at com.example.drowzy.FaceDetectionProcessor.onSuccess(FaceDetectionProcessor.java:38)
at com.example.drowzy.VisionProcessorBase.onSuccess(VisionProcessorBase.java:114)
at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:251)
at android.app.ActivityThread.main(ActivityThread.java:6572)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
它说我的上下文为空。我已经在 google 中尝试了可能的解决方案,但它不起作用。我初始化上下文的方式是否错误?我可以在 FaceDetectionProcessor 中没有指定上下文的情况下在另一个 class 中调用 drowzy_alert 方法吗?
这是我的 LivePreviewActivity
public void eye_tracking(@NonNull FirebaseVisionFace face){
if (face.getRightEyeOpenProbability() < 0.1 && face.getLeftEyeOpenProbability() < 0.1) {
drowzy_alert();
}
}
public void drowzy_alert(){
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Drowzy Detected")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// FIRE ZE MISSILES!
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
builder.create();
}
这是我的 FaceDetectionProcessor
protected void onSuccess(
@Nullable Bitmap originalCameraImage,
@NonNull List<FirebaseVisionFace> faces,
@NonNull FrameMetadata frameMetadata,
@NonNull GraphicOverlay graphicOverlay
) {
graphicOverlay.clear();
if (originalCameraImage != null) {
CameraImageGraphic imageGraphic = new CameraImageGraphic(graphicOverlay, originalCameraImage);
graphicOverlay.add(imageGraphic);
}
for (int i = 0; i < faces.size(); ++i) {
FirebaseVisionFace face = faces.get(i);
int cameraFacing =
frameMetadata != null ? frameMetadata.getCameraFacing() :
Camera.CameraInfo.CAMERA_FACING_BACK;
FaceGraphic faceGraphic = new FaceGraphic(graphicOverlay, face, cameraFacing);
LivePreviewActivity livePreviewActivity = new LivePreviewActivity();
graphicOverlay.add(faceGraphic);
livePreviewActivity.eye_tracking(face);
}
graphicOverlay.postInvalidate();
}
LivePreviewActivity livePreviewActivity = new LivePreviewActivity();
您不能以这种方式实例化 LivePreviewActivity。如果您有 activity,则只能使用 startActivity 或由 android 管理的其他上下文方法。
整个想法是,每当您使用 activity 时,activity 应该位于 activity 堆栈的顶部(即对您的用户可见)并且 startActivity 会这样做你。它还在您的活动中传递应用程序和 activity 上下文,应用程序需要这些上下文来了解应用程序和设备的状态。如果没有此上下文,应用程序将无法运行。
您的 activity 需要位于堆栈顶部的原因是,一旦 activity 不再位于堆栈顶部,它可以被 android 杀死在任何时候都可以节省内存,您无法采取任何措施来防止这种行为。您可以对 activity 被杀做出反应,但不能超过此数。
据我所知,您必须将所有这些逻辑移动到一个 activity 而不是将其分成两个。如果您确实想同时加载多个活动,请考虑改用片段。