java - 无法在 Android Studio 中运行应用程序。空指针异常

标签 java android xml android-layout nullpointerexception

我正在尝试启动一个简单的应用程序,当您单击按钮(StartButton)时,它将启动 Mix() 方法,该方法将打乱从字符串数组(wordPick)中随机选择的单词并设置文本字段 (ScambleF) 到它。从那里,另一个按钮 (EnterButton) 从可编辑文本字段 (EnterF) 中读取内容,并检查用户在 EnterF 文本字段中输入的单词是否与未打乱的单词匹配。

不幸的是,我在模拟器中启动应用程序时立即收到以下错误。我在这里寻找答案,但到目前为止唯一有帮助的是在 onCreate() 之前没有初始化我的变量。

编辑:添加了一个计时器,但现在它没有任何功能。

FATAL EXCEPTION: main
Process: com.example.roland.scramblegame, PID: 19156

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roland.scramblegame/com.example.roland.scramblegame.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.content.ContextWrapper.getResources(ContextWrapper.java:87)
at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81)
at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:541)
at android.content.Context.getString(Context.java:409)
at com.example.roland.scramblegame.MainActivity.Fill(MainActivity.java:64)
at com.example.roland.scramblegame.MainActivity.onCreate(MainActivity.java:27)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

这是我的 Java 文件

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {

String []wordPick;
int track;
Button StartButton, EnterButton;
TextView ScrambleF;
EditText EnterF;
MainActivity run;

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

    run = new MainActivity();
    wordPick = new String[16];
    wordPick = run.Fill(wordPick);
    StartButton = (Button)findViewById(R.id.StartB);
    EnterButton = (Button)findViewById(R.id.EnterB);

    StartButton.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    Random rand = new Random();
                    track = rand.nextInt(16);
                    ScrambleF = (TextView)findViewById(R.id.Question);
                    ScrambleF.setText( run.Mix(wordPick[track]) );
                }
            }
    );

    EnterButton.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    EnterF = (EditText) findViewById(R.id.Answer);
                    if (EnterF.getText().toString().equalsIgnoreCase(wordPick[track])) {
                        //Correct
                    }
                    else {
                        //Incorrect
                    }
                }
            }
    );
}


public String[] Fill (String[] array) {
    //Im just going to add random words
    if (array == null) {
        array = wordPick;
    }
    array[0] = getString(R.string.W_Bottle);
    array[1] = getString(R.string.W_Samurai);
    array[2] = getString(R.string.W_Keyboard);
    array[3] = getString(R.string.W_Shrimp);
    array[4] = getString(R.string.W_Project);
    array[5] = getString(R.string.W_Planet);
    array[6] = getString(R.string.W_Walnut);
    array[7] = getString(R.string.W_PacMan);
    array[8] = getString(R.string.W_Shelter);
    array[9] = getString(R.string.W_Android);
    array[10] = getString(R.string.W_Toilet);
    array[11] = getString(R.string.W_Numbers);
    array[12] = getString(R.string.W_Anime);
    array[13] = getString(R.string.W_Goldfish);
    array[14] = getString(R.string.W_Phantom);
    array[15] = getString(R.string.W_Jigsaw);

    return array;
}

public String Mix (String str) {
    //This scrambles up the words in the string array
    if(str == null) {
        str = wordPick[track];
    }
    char[] characters = str.toCharArray();
    for (int i = 0; i < characters.length; i++) {
        int randomIndex = (int)(Math.random() * characters.length);
        char temp = characters[i];
        characters[i] = characters[randomIndex];
        characters[randomIndex] = temp;
    }

    str = String.valueOf(characters);
    return str;
}
}

list

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

如果需要,我也将 Activity_main.xml 留在这里

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.roland.scramblegame.MainActivity"
android:background="#006699">

<Chronometer
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/chronometer"
    android:textSize="25sp"
    android:textStyle="bold"
    android:textColor="#ffffff"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="SCRAMBLED WORD"
    android:id="@+id/Question"
    android:enabled="false"
    android:textSize="30sp"
    android:textStyle="bold"
    android:textColor="#FFFFFF"
    android:background="#427030"
    android:padding="5dp"
    android:layout_above="@+id/Answer"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="70dp" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/Answer"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:width="250dp"
    android:background="#dddddd"
    android:height="45dp"
    android:clickable="false"
    android:singleLine="true"
    android:minHeight="35dp"
    android:inputType="text" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/StartButton"
    android:id="@+id/StartB"
    android:layout_below="@+id/Answer"
    android:layout_alignStart="@+id/Answer"
    android:layout_marginTop="43dp" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/EnterButton"
    android:id="@+id/EnterB"
    android:layout_alignTop="@+id/StartB"
    android:layout_alignEnd="@+id/Answer" />

</RelativeLayout>

最佳答案

我认为错误可能来自于onCreate中的以下代码:

run = new MainActivity();
wordPick = new String[16];
wordPick = run.Fill(wordPick);

您确定需要通过new Activity()创建一个 Activity 吗?这有点奇怪,不推荐。

尝试将三行替换为:

wordPick = Fill(new String[16]);

也许这会有所帮助。

关于java - 无法在 Android Studio 中运行应用程序。空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38650206/

相关文章:

java - 我在代码中使用 Object 父类(super class),但它抛出错误 constructor(int int) undefined

java - 检测手指何时离开屏幕并更新指针

android - 在 TableRow 中垂直排列的两个元素

android - 拦截来自外部应用程序的 Intent

java - 如何将 Java 中的 If 结构转换为带有字符串或枚举值的 Switch Case?

java - 是否有可能为 2^14 个音频帧实现 65 微秒 FFT?

java - 使用循环排列来降低旅行商的复杂性

java - 使用 mySQL 和 php 强制关闭 android 中的注册 Activity

java - 如何通过 Java 将标记添加到 XML 的序言

java - 如何设置JavaFX密码字段echo char