在代码中找不到错误

时间:2013-08-20 14:19:17

标签: java nullpointerexception

我正在编写一些代码来帮助教我如何使用java和我使用数组的代码。我有一个错误,我无法弄清楚它为什么会发生。 守则:

import java.util.Scanner;
public class pubQuizArray {
private static Scanner kb = new Scanner (System.in);
static String[] questions;
static String[][] answers;
static char[] realAnswers;
static char ans;
static char yn;
static int questionNum;
static int questionNumArray;
static int numQ;
static int score = 0;

public static void writeQuiz()
{
    getQNum();
    getQ();
}

public static void getQNum()
{
    System.out.println("How many Questions?");
    numQ = kb.nextInt();
    questions = new String[numQ];
}

public static void getAns()
{
    questionNumArray = questionNum - 1;
    answers = new String[numQ][];
    System.out.println("What are the answers?");

    System.out.println("a: ");
    answers[questionNumArray][0] = kb.nextLine();

    System.out.println("b: ");
    answers[questionNumArray][1] = kb.nextLine();

    System.out.println("c: ");
    answers[questionNumArray][2] = kb.nextLine();

    System.out.println("d: ");
    answers[questionNumArray][4] = kb.nextLine();

    realAnswers = new char[numQ];
    System.out.println("What is the correct Answer?");
    realAnswers[questionNum] = kb.next().charAt(0);

}

public static void getQ()
{
    questionNum = 0;
    System.out.println("What is the First Question?");
    questions[questionNum] = kb.nextLine();
    getAns();
    questionNum ++;
    while(questionNum < numQ)
    {
        System.out.println("What is the next Question?");
        questions[questionNum] = kb.nextLine();
        getAns();
        questionNum ++;
    }
}

public static void askQ()
{
    questionNum = 0;
    while(questionNum < numQ)
    {
        System.out.println("Q1: " + questions[questionNum]);

        System.out.println("a: " + answers[questionNum][0]);
        System.out.println("b: " + answers[questionNum][1]);
        System.out.println("c: " + answers[questionNum][2]);
        System.out.println("d: " + answers[questionNum][3]);

        ans = kb.next().charAt(0);
        if(ans == realAnswers[questionNum])
        {
            System.out.println("That was correct");
            score ++;
        }
    }
}

public static void menu()

{
    System.out.println("Would you like to write a new Quiz? y/n");
    yn = kb.next().charAt(0);
    while(yn == 'y')
    {
        writeQuiz();
        System.out.println("Would you like to play the Quiz? y/n");
        yn = kb.next().charAt(0);
        while(yn == 'y')
        {
            askQ();
            System.out.println("Would you like to play again? y/n");
            yn = kb.next().charAt(0);
        }
    }
}

public static void main(String[] args)
{
    menu();
}
}

错误是这样的:

Would you like to write a new Quiz? y/n
y
How many Questions?
10
What is the First Question?
What are the answers?
a: 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at pubQuizArray.getAns(pubQuizArray.java:34)
    at pubQuizArray.getQ(pubQuizArray.java:56)
    at pubQuizArray.writeQuiz(pubQuizArray.java:17)

提前感谢您提供的任何帮助。请记住,这只是一个试验计划,我还在学习java。

好的我这次有另一个问题:

Would you like to write a new Quiz? y/n
y
How many Questions?
1
What is the First Question?
and
What are the answers?
a: a
Exception in thread "main" java.lang.NullPointerException
    at pubQuizArray.getAns(pubQuizArray.java:34)
    at pubQuizArray.getQ(pubQuizArray.java:57)
    at pubQuizArray.writeQuiz(pubQuizArray.java:17)
    at pubQuizArray.menu(pubQuizArray.java:96)
    at pubQuizArray.main(pubQuizArray.java:110)

我已经更新了之前的其他代码。

1 个答案:

答案 0 :(得分:3)

此时,在getAns()

questionNumArray = questionNum - 1;
answers = new String[numQ][];
System.out.println("What are the answers?");

System.out.println("a: ");
answers[questionNumArray][0] = kb.nextLine();

questionNumArray包含值-1,它是数组的无效索引。

它来自

public static void getQ()
{
    questionNum = 0; // set to 0
    System.out.println("What is the First Question?");
    questions[questionNum] = kb.nextLine();
    getAns(); // still 0 
    questionNum ++; // too late
    ...
}

修改

您将获得的NPE归结为

System.out.println("a: ");
answers[questionNumArray][0] = kb.nextLine();

您尚未初始化answers[questionNumArray],因此它是null。首先执行以下操作

answers[questionNumArray] = new String[someSize]; // someSize should probably be 5 looking at your code