Java 尝试在空对象引用上调用虚拟方法 'android.view.Window$Callback android.view.Window.getCallback()'

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/36666091/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 18:33:27  来源:igfitidea点击:

Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

javaandroidfindviewbyid

提问by

When my SplashActivityopens the LoginActivitymy app crashes.

当我SplashActivity打开时,LoginActivity我的应用程序崩溃了。

The following is my SplashActivity.java:

以下是我的SplashActivity.java

package com.example.android.appName;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import java.util.Timer;
import java.util.TimerTask;

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            }
        }, 1500);
    }
}

and my LoginActivity.java:

和我的LoginActivity.java

package com.example.android.appName;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

public class LoginActivity extends AppCompatActivity {
    private EditText usernameField = (EditText)findViewById(R.id.username),
                     passwordField = (EditText)findViewById(R.id.password);
    private TextView error = (TextView)findViewById(R.id.error);
    private ProgressBar progress = (ProgressBar)findViewById(R.id.progress);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.login_menu, menu);
        return true;
    }  

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (android.os.Build.VERSION.SDK_INT > 5
                && keyCode == KeyEvent.KEYCODE_BACK
                && event.getRepeatCount() == 0) {
            onBackPressed();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void exit(MenuItem item) {
        finish();
    }

    public void signIn(View view) {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

Part of AndroidManifest.xml:

部分AndroidManifest.xml

<activity android:name=".SplashActivity"
    android:theme="@style/NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".LoginActivity"
    android:label="@string/title_activity_login" />

Error in logcat:

logcat 中的错误:

04-16 23:24:16.124 4015-4015/com.example.android.appName E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.example.android.appName, PID: 4015
 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.android.appName/com.example.android.appName.LoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2993)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3248)
     at android.app.ActivityThread.access00(ActivityThread.java:197)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:145)
     at android.app.ActivityThread.main(ActivityThread.java:6872)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
     at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:68)
     at android.support.v7.app.AppCompatDelegateImplV7.<init>(AppCompatDelegateImplV7.java:145)
     at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:28)
     at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:42)
     at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:186)
     at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:168)
     at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:508)
     at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:180)
     at com.example.android.appName.LoginActivity.<init>(LoginActivity.java:20)
     at java.lang.reflect.Constructor.newInstance(Native Method)
     at java.lang.Class.newInstance(Class.java:1690)
     at android.app.Instrumentation.newActivity(Instrumentation.java:1080)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2983)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3248)?
     at android.app.ActivityThread.access00(ActivityThread.java:197)?
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)?
     at android.os.Handler.dispatchMessage(Handler.java:102)?
     at android.os.Looper.loop(Looper.java:145)?
     at android.app.ActivityThread.main(ActivityThread.java:6872)?
     at java.lang.reflect.Method.invoke(Native Method)?
     at java.lang.reflect.Method.invoke(Method.java:372)?
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)?
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

采纳答案by George Mulligan

An Activityis not fully initialized and ready to look up views until after setContentView(...)is called in onCreate().

AnActivity尚未完全初始化并准备好查找视图,直到在setContentView(...)中调用之后onCreate()

Only declare the fields like the following:

只声明如下字段:

private EditText usernameField, passwordField;
private TextView error;
private ProgressBar progress;

and then assign the values in onCreate:

然后分配值onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    usernameField = (EditText)findViewById(R.id.username);
    passwordField = (EditText)findViewById(R.id.password);
    error = (TextView)findViewById(R.id.error);
    progress = (ProgressBar)findViewById(R.id.progress);
}

Might not be part of the problem but as an extra bit of advice a Timerruns the TimerTaskon a background thread and that should be avoided in this case. Replace the Timerwith a Handlerinstead to run it on the UI thread.

可能不是问题的一部分,但作为一个额外的建议, a在后台线程上Timer运行,TimerTask在这种情况下应该避免。替换为TimeraHandler以在 UI 线程上运行它。

new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }
}, 1500);

回答by Gowtham Gowda

Views defined in xml file can only be accessed in java code, after setting the ContentViewas the required xml file using:

在 xml 文件中定义的视图只能在 java 代码中访问,ContentView使用以下命令将其设置为所需的 xml 文件后:

setContentView(R.layout.xml_file_name);

So 1st call above method inside onCreatemethod and then initialize the Viewinstances inside onCreateor inside the methods in which the instance will be used.

所以第一次在方法内部调用上面的方法onCreate,然后在将使用实例的方法View内部onCreate或内部初始化实例。