【问题标题】:Android App Crash NullPointerExceptionAndroid 应用程序崩溃 NullPointerException
【发布时间】:2015-02-13 02:29:07
【问题描述】:

我已经完成了搜索,似乎是根据具体情况来确定造成这种情况的原因。不过,真正了解它的人很可能会不同意。

从我的主屏幕进入其他活动的按钮工作得很好,与不起作用的唯一区别是它实际上是从另一个 .java 文件中提取一个类/变量,所以我确定我没有'没有正确实现它。

这是一个单例类:

GLOBAL.JAVA

//Constructor 
//
protected Global() {
    getInstance();
}


//Singleton Method
//
public static Global getInstance() {
    if(instance == null) {
        initialize();
        instance = new Global();
    }
    return instance;
}

我有一些(静态)类结构(我使用术语结构,因为我主要使用 C++ 编程,对我来说,它们就是这样),它们被放置在全局文件/类中,以及这个包含程序的所有数据static questionStruct[] questions = new questionStruct[TOTAL_QUESTIONS];

getInstance()(单例方法)调用的initialize(); 函数只是将数据填充到questionStruct[] 数组中。

我有一个返回字符串的方法

public static String getQ(int q){

    return questions[q].q;
}

在按下按钮调用的 .java 文件中,我有 placeData(); 只是为了测试一下,在那个函数中:

public void placeData() {

    String testString = ("Testing Text: " + Global.getQ(3));

    TextView Q = (TextView) findViewById(R.id.testingText);
    Q.setText(testString);


}

最后......希望......它应该出现在 XML 文件中的 TextView:

    <TextView
        android:id="@+id/testingText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

这是我的官方错误,我认为是崩溃的指示器,仅在我按下按钮初始化此活动时才会发生。

java.lang.RuntimeException: Unable to start activity ComponentInfo{godwin.com.study/godwin.com.study.practice}: java.lang.NullPointerException: Attempt to read from field 'java.lang.String godwin.com.study.Global$questionStruct.q' on a null object reference

想法???

编辑:

Global.Java 中的类(如 C++ 中的结构)

class answerStruct
{
    String a;
    boolean status;
}


//Structure for Questions
//
class questionStruct
{
    String q;

    answerStruct[] answer = new answerStruct[TOTAL_ANSWERS];

}

“initialize()”函数:

public static void initialize() {

    questions[0].q = "Question # 1";
    questions[0].answer[0].a = "Q1A1";
    questions[0].answer[0].status = true;
    questions[0].answer[1].a = "Q1A2";
    questions[0].answer[1].status = false;

    ...And so on...Forever
}

【问题讨论】:

  • questionStruct 声明在哪里?
  • 什么是questions[q].q;?我认为您不需要最后一个.q,只需questions[q]?完整的跟踪和行号也可能有所帮助。
  • 很明显,问题是当您调用getQ 获取q 的某个值时,questions[q]null。这表明initialize() 方法存在问题,但除非您发布该方法的代码,否则无法告诉您如何解决它。
  • 大家好,感谢您的回复。希望我能澄清一些事情。 quesitonStruct 是在 Global.java 中声明的类。变量quesitons[q].q 中的.q 实际上是“questions[]”类数组中的一个字符串。并且初始化方法用信息填充数组。我想我遗漏了一些东西,但我认为我不需要发布所有内容。试图在什么都不发和什么都发之间找到一个快乐的媒介,哈哈。我将编辑代码,希望能提供你需要的帮助我的东西。再次感谢。
  • 如果需要,我可以从原始问题中删除当前代码段,然后复制/粘贴整个文件...我认为所涉及的是 2x .java 文件和 1x XML。

标签: java android xml crash


【解决方案1】:

当您像这样在 Java 中分配对象数组时:

static questionStruct[] questions = new questionStruct[TOTAL_QUESTIONS];

您只是分配了一个对象引用数组,实际上并没有分配对象本身。这有点像你在 C++ 中分配了一个指针数组,但它们还没有指向任何东西。

在您的 initialize() 函数的顶部,您可以分配所有 questionStruct 对象,以及嵌套 for 循环中每个对象的答案,如下所示:

for(int i = 0; i < TOTAL_QUESTIONS; i++)
{
    questions[i] = new questionStruct();
    for(int j = 0; j < TOTAL_QUESTIONS; j++)
        questions[i].answer[j] = new answerStruct();
}

然后你可以像你一样遍历并初始化结构中的所有字段。

【讨论】:

  • 走上正轨,我正在关注,但在我看来,设置将是重复的。诚然,我累死了,这个问题让我自己对眼了,哈哈。但是,static questionStruct[] questions = new questionStruct[TOTAL_QUESTIONS]; 的声明和您提供的“for 循环”不是重复的吗?我理解您建议使用 for 循环的理由。这是有道理的,即使在我目前的心态下。但是我不应该摆脱第一个声明吗?老实说,我敢肯定,如果我明天再做这件事,那是有道理的,但现在……没那么多。
  • 不,你需要两个声明。第一个分配数组本身,循环中的分配分配存储在数组中的每个对象。
  • 我不能完全将您的答案标记为答案,但它肯定有帮助。实际上,我在其他地方遇到了导致崩溃的问题,但我也知道我没有正确实现单例类,而且显然我在声明数组时是错误的。所以,感谢您的意见,它确实有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2012-10-04
相关资源
最近更新 更多