【问题标题】:Cannot fix Java null pointer error无法修复 Java 空指针错误
【发布时间】:2016-07-23 22:49:28
【问题描述】:

我有一些代码在运行时返回空指针错误。这是来自 logcat 的代码和错误:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.res.Resources;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
import java.lang.String;
import java.util.Random;


public class MainActivity extends AppCompatActivity {

    private static final Random r_generator = new Random();
    String textViewString;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Resources res = getResources();
        String[] myString = res.getStringArray(R.array.colorArray);
        String q = myString[r_generator.nextInt(myString.length)];
        TextView tv = (TextView) findViewById(R.id.color_text);
        tv.setText(q);

    Button green= (Button) findViewById(R.id.green_button);
    green.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
            if (!textViewString.equals("Green")) return;
            Resources res = getResources();
            String[] myString = res.getStringArray(R.array.colorArray);
            String q = myString[r_generator.nextInt(myString.length)];
            TextView tv = (TextView) findViewById(R.id.color_text);
            tv.setText(q);
        }
    });

    Button blue = (Button) findViewById(R.id.blue_button);
    blue.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
            if (!textViewString.equals("Blue")) return;
            Resources res = getResources();
            String[] myString = res.getStringArray(R.array.colorArray);
            String q = myString[r_generator.nextInt(myString.length)];
            TextView tv = (TextView) findViewById(R.id.color_text);
            tv.setText(q);
        }
    });

    Button red = (Button) findViewById(R.id.red_button);
    red.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
            if (!textViewString.equals("Red")) return;
            Resources res = getResources();
            String[] myString = res.getStringArray(R.array.colorArray);
            String q = myString[r_generator.nextInt(myString.length)];
            TextView tv = (TextView) findViewById(R.id.color_text);
            tv.setText(q);

        }
    });

        }
    }

我已尝试查看其他非法状态错误问题,但我仍然不知道我的个人案例出了什么问题。

这是错误代码:

 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                       java.lang.NullPointerException
                                                                                           at com.example.cedric.learnthecolors.MainActivity$1.onClick(MainActivity.java:31)
                                                                                           at android.view.View.performClick(View.java:4476)
                                                                                           at android.view.View$PerformClick.run(View.java:18795)
                                                                                           at android.os.Handler.handleCallback(Handler.java:730)
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                                           at android.os.Looper.loop(Looper.java:177)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:5496)
                                                                                           at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                           at java.lang.reflect.Method.invoke(Method.java:525)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041)
                                                                                           at dalvik.system.NativeStart.main(Native Method)

这是我的布局文件:

<LinearLayout 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"
    android:theme="@android:style/Theme.Holo.Light"
    tools:context="com.example.cedric.learnthecolors.MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/color_text"
            android:text="@string/Green"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="68sp"
            android:gravity="center"
            android:textAllCaps="true"/>

    </LinearLayout>

    <LinearLayout android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <Button
            android:id="@+id/green_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/green_button"/>

        <Button
            android:id="@+id/blue_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/blue_button"/>

        <Button
            android:id="@+id/red_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/the_red_button"/>

    </LinearLayout>

    <LinearLayout android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <Button
            android:id="@+id/yellow_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/yellow_button"/>

        <Button
            android:id="@+id/white_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/white_button"/>

        <Button
            android:id="@+id/orange_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/orange_button"/>

    </LinearLayout>

    <LinearLayout android:id="@+id/linearLayout3"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <Button
            android:id="@+id/brown_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/brown_button"/>

        <Button
            android:id="@+id/pink_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/pink_button"/>

        <Button
            android:id="@+id/purple_button"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onClick"
            android:background="@drawable/purple_button"/>

    </LinearLayout>

</LinearLayout>

非常感谢!!!

【问题讨论】:

  • 不幸的是,我是 Java 新手(这是我的第一天),我对上一篇文章中的“引用类型”、“原始值”、“解引用”等语言不太了解.如果我能得到一个具体的答案,我想我将能够通过示例学习并能够自己清除未来的错误。
  • if (!textViewString.equals("Red")) return; 我不明白这一行。另一件事,您为蓝色按钮设置了两次onClickListener,而不是为红色按钮设置了一次。可能是复制粘贴错误。
  • 错误发生在哪一行?
  • @Rotwang 当它不是那个异常时,这怎么会是 NullPointerException 的副本?
  • @Vucko 是的,第二个。还是重复的,不是吗?

标签: java android


【解决方案1】:

问题出在这一行:

!textViewString.equals()

因为在使用 textViewString 之前,您没有在任何地方赋予它值。至少将它分配给一个空字符串,或者只是删除该行,因为目前它对你没有多大好处,我真的不明白这一点。由于您无法更改它的值,因此您的任何按钮都不会起作用(即使没有例外)。

【讨论】:

    【解决方案2】:

    您没有为红色按钮设置 onClickListener,而是将侦听器重新分配给蓝色按钮。

    Button red = (Button) findViewById(R.id.red_button);
    blue.setOnClickListener(new View.OnClickListener() {
    

    您是否还在 xml 布局文件中定义了 onClick 属性?如果是这样,那么您需要确保您有一个与您指定的名称匹配的方法。例如,如果您输入了

    onClick="buttonClicked"
    

    你需要定义一个方法叫

    public void buttonClicked() { /* OnClick functionality here */ }
    

    请参阅:@vucko 的@https://stackoverflow.com/a/38547338/1540698,了解您的第二期。

    【讨论】:

    • 你怎么知道@Vucko?你能解释一下,鉴于海报中缺乏信息,这可能不是问题吗?
    • 查看来自用户的调整信息,看起来这很可能是一个问题,因为发布者通过 xml 分配一个 onClick 侦听器,然后通过代码重新分配一个。由于未分配红色按钮的代码,因此在 XML 中的 onClick 中留下了一个死方法调用。
    • 我知道,正如你所看到的我的评论,我注意到在你写这个答案之前 22 分钟。但这只是一部分,主要问题是textViewString
    • @Vucko - 好地方,可能解释了为什么它会因 2 个不同的错误而崩溃。您发现的那个空指针和我发现的那个的非法状态:D 我对您的答案投了赞成票 :)
    • 谢谢,伙计。我发现了这两个,只有他从我的评论中修复了第一个,所以我没有在答案中提到它:D
    【解决方案3】:

    尝试更改主题并检查是否有效。

     android:theme="@android:style/Theme.Holo.Light"
    

    【讨论】:

      【解决方案4】:

      在你的布局中,你说:

      android:onClick="onClick"
      

      您似乎没有包含 Activity 的所有代码,但我敢打赌它没有定义名为 onClick 的方法

      您需要做的就是定义方法。

      【讨论】:

        猜你喜欢
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多