Android Java:从另一个类调用的AlertDialog方法导致空指针异常

Android Java:从另一个类调用的AlertDialog方法导致空指针异常,java,android,nullpointerexception,android-alertdialog,Java,Android,Nullpointerexception,Android Alertdialog,我试图从另一个类调用一个方法,该类随后调用AlertDialog方法,我尝试了很多方法,但它总是导致空指针异常。调用类正在运行一个web服务器,我在activity类上有一个包含被调用方法的RecyclerView列表。下面是带有AlertDialog的活动类中的一些代码: public class ListClass extends AppCompatActivity { private WebSvr server; private static final int PORT

我试图从另一个类调用一个方法,该类随后调用
AlertDialog
方法,我尝试了很多方法,但它总是导致空指针异常。调用类正在运行一个web服务器,我在activity类上有一个包含被调用方法的
RecyclerView
列表。下面是带有
AlertDialog
的活动类中的一些代码:

public class ListClass extends AppCompatActivity {

    private WebSvr server;
    private static final int PORT = 8080;
    private androidx.appcompat.widget.Toolbar toolbar;
    private ListView lv;
    private CustomAdapter customAdapter;
    public ArrayList<EditModel> editModelArrayList;
    public static String[] newList = new String[20];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_server_screen);
        toolbar = (androidx.appcompat.widget.Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        startWebServer();

        customAdapter = new CustomAdapter(this, editModelArrayList);
        lv.setAdapter(customAdapter);
    }

    public static boolean listUpdated;

    public void updateList() {
        listUpdated = false;
        Runnable r = new Runnable() {
            @Override
            public void run() {

                for (int i = 0; i < 20; i++) {
                    if (CustomAdapter.editModelArrayList.get(i).getEditTextValue() != "") {
                        newList[i] = CustomAdapter.editModelArrayList.get(i).getEditTextValue();
                    } else {
                        if (!showNotification) {

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    showNullFieldNotification(); // <------------- CALLING THIS 
                                }
                            });
                            showNotification = true;
                        }
                    }
                }
                listUpdated = true;
            }
        };
        Thread thread = new Thread(r);
        thread.start();
    }

    boolean showNotification = false;

    public void showNullFieldNotification() {
        new AlertDialog.Builder(ListClass.this)
                .setTitle("Warning, some fields are empty")
                .setNegativeButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.cancel();
                        showNotification = false;
                    }
                }).show();
    }

    public static boolean returnListUpdated() {
        return listUpdated;
    }

...

}
ListClass
中调用该方法的位置:

showNullFieldNotification();
错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.espressif.iot_esptouch_demo, PID: 18217
    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.myProject.ListClass.showNullFieldNotification(ListClass.java:177)
        at com.myProject.ListClass$4.run(ListClass.java:193)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6665)
        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:772)

您忘记了创建警报对话框,因此它是空的,而不是上下文

从中得到了答案。需要使用静态上下文

由于您是从活动外部调用,因此需要在活动类中保存上下文:

public static Context context;
在onCreate中:

context = this;
要显示通知,请执行以下操作:

new Handler(Looper.getMainLooper()).post(new Runnable(){
            @Override
            public void run(){

                new AlertDialog.Builder(context)
                        .setTitle("Warning, some fields are empty")
                        .setNegativeButton("OK",new DialogInterface.OnClickListener(){
                            @Override
                            public void onClick(DialogInterface dialogInterface,int i){
                                dialogInterface.cancel();
                                showNotification=false;
                            }
                        }).show();

            }
        });

activity类中调用的方法也必须是
public static

这是否回答了您的问题?事实上,我昨天读了这个答案,读了之后,我尝试使用我在问题末尾更新的方法,看看它是否会添加一些必要的初始化,但没有帮助。除此之外,除了我已经尝试过的方法之外,我想不出一种方法来解决我的特殊问题。你有什么特别的建议吗?我试着用这个答案中的解决方案来获取上下文,但也没有用\n我实际上已经试过了,我用我使用的方法更新了这个问题。使用的方法不使用.create()在从同一个类调用时可以正常工作,所以我不认为这有什么区别。
public static Context context;
context = this;
new Handler(Looper.getMainLooper()).post(new Runnable(){
            @Override
            public void run(){

                new AlertDialog.Builder(context)
                        .setTitle("Warning, some fields are empty")
                        .setNegativeButton("OK",new DialogInterface.OnClickListener(){
                            @Override
                            public void onClick(DialogInterface dialogInterface,int i){
                                dialogInterface.cancel();
                                showNotification=false;
                            }
                        }).show();

            }
        });