0

因为我的日志命令踢出一个“4”我猜它是:

word.getnewword();

那是返回空指针异常,但是为什么呢?

代码的目的是让一个类在一个单词中保存不同的字母,然后分别为单词中的每个字母设置动画,然后从类中的列表中将单词更改为随机的新单词。我对每个字母使用字符而不是单词或每个字母的字符串,这也可以吗?

package com.xyz.letters;

import ......abreviated



public class letters extends Activity {

private Animals word;
boolean gameover = false;
private AdView adView;

TextView tva;
TextView tvb;
TextView tvc;
TextView tvd;
TextView tve;
TextView tvf;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.letters);
    Log.e("main", "xml loaded fine"); 
    tva = (TextView) findViewById(R.id.texta);
    tvb = (TextView) findViewById(R.id.textb);
    tvc = (TextView) findViewById(R.id.textc);
    tvd = (TextView) findViewById(R.id.textd);
    tve = (TextView) findViewById(R.id.texte);
    tvf = (TextView) findViewById(R.id.textf);
    Log.e("main", "textview pre-setup complete"); 




    Log.e("main", "4"); 
        word.getnewword();  
        Log.e("main", "gotword " + word.getwordchosennumber());
        setletters();
        Log.e("main", "set letters ok");
......etc

我的课:-

package com.xyz.letters;

import java.util.Random;

import android.util.Log;


public class Animals {

private int wordchosen;
private int length;
private char l1;
private char l2;
private char l3;
private char l4;
private char l5;
private char l6;


public Animals() {
    this.wordchosen = 0;
    this.length = 3;
    this.l1 = 'a';
    this.l2 = 'b';
    this.l3 = 'c';
    this.l4 = 'a';
    this.l5 = 'b';
    this.l6 = 'c';

}

public void getnewword() {
    Log.e("animals", "0");
       Random ran = new Random();
        Log.e("animals", "1");
       wordchosen = ran.nextInt(2); 
        Log.e("animals", "2");

   switch (wordchosen) {
        case 0:
            length = 3;
            l1 = 'a';
            l2 = 'n';
            l3 = 't';
            break;
        case 1:
            length = 4;
            l1 = 'b';
            l2 = 'a';
            l3 = 'l';
            l4 = 'l';
            break;
        case 2:
            length = 3;
            l1 = 'b';
            l2 = 'a';
            l3 = 't';
            break;


        default: 
            length = 0;
            break;
    }
}

public int getwordchosennumber()
{
    return this.wordchosen;
}

public int getlength()
{
    return this.length;
}

public int getl1()
{
    return this.l1;
}

public int getl2()
{
    return this.l2;
}

public int getl3()
{
    return this.l3;
}

public int getl4()
{
    return this.l4;
}

public int getl5()
{
    return this.l5;
}

public int getl6()
{
    return this.l6;
}
} 
4

5 回答 5

2

因为,word有价值null。异常null pointer exception本身指定了它的含义,即您要访问具有null引用的某个对象。

在这里声明

private Animals word;

最初,它有null参考,直到你不会做类似的事情

word = new Animals();  // assign Animals reference
于 2012-12-29T04:49:44.073 回答
0

你永远不会初始化word. 在错误之前的行(或在初始声明中),使用new

word = new Animals(); // The line to insert.
word.getnewword();

关于以后的问题,当您遇到异常或强制关闭时,请发布完整的 LogCat 堆栈跟踪(日志输出中的红色文本),以帮助我们更快地找到问题。

于 2012-12-29T04:49:26.133 回答
0

在 OnCreate 之后 Log.e("main", "textview pre-setup complete");

添加

word = new Animals();
于 2012-12-29T05:14:07.907 回答
0

您应该创建类的对象,例如

  word = new Animals();

现在,使用这个对象来访问 Animals 类的公共方法和变量。

 word.getnewword();
于 2012-12-29T05:18:52.913 回答
0

你得到一个 NullPointerException 因为变量“word”没有被初始化。在使用变量时,Android 有点奇怪。如果在调用变量之前没有在 onCreate 方法(或从 onCreate 方法调用的某个方法)中初始化变量,那么您将收到 NullPointerException,因为 JVM 不知道该变量的值是什么。这有点像具有 main 方法的常规 java 代码 - 如果您调用尚未在 main 方法中初始化的变量,您将获得 NullPointerException。

要修复您的代码,只需在对变量进行任何调用之前将其放在 onCreateMethod 中:

word = new Animals();

之后,您可以使用变量执行所需的操作。

于 2012-12-29T06:25:55.373 回答