中国研究的简单数组上的Java NullPointerException

时间:2013-09-08 23:24:43

标签: java eclipse exception nullpointerexception

我正在使用Java编写一个非常简单的命令行程序来测试我对中文书写系统的了解。目标是呈现英语,拼音或汉字,然后强制用户输入未显示的2。在完成一些简单的Array错误之后,我遇到了NullPointerException。

现在,我明白它是什么,我根本看不出它为什么会发生。

在名为Master.java的文件中,我有以下内容:

static final String [] [] Mandarray = {{"You", "Nǐ", "你"}, {"Good", "Hǎo", "好"}};

在我的Chinese_Mandarin对象的构造函数中,我将这个数组的内容复制到一个新的,一个Chinese_Mandarin对象的成员,就像这样,

    public Chinese_Mandarin(char transfer){ 
    if(transfer == 'n' || transfer != 'y')System.exit(0);

    for (int i = (Master.Mandarray.length-1); i>0 ;i--){
        mandalist [i][0] = Master.Mandarray[i][0];
        mandalist [i][1] = Master.Mandarray[i][1];
        mandalist [i][2] = Master.Mandarray[i][2];
    }

系统的上述“if”部分询问用户是否希望继续,这并不重要。 接下来,我检查以确保通过查看第一个字符是否*来确保不再显示相同的条目,这是由我的程序指示该条目已被使用。

public void presenter(){
    Scanner chinEngl = new Scanner(System.in);
    restart: for (int i = mandalist.length; i>0 ;i--){
        randInt = random.nextInt(mandalist.length);
        randIntSub = random.nextInt(3);
        if(mandalist[randInt][randIntSub] == ""){
            continue restart;
        }
        else if (((mandalist[randInt][randIntSub]).charAt(0)) == '*'){
            continue restart;
        }

在这里,我初始化一个稍后要使用的扫描程序,创建两个随后要使用的随机整数,并确保元素不为空(如果它们是,我将传递给标记'restart'继续循环尽管如此)。

在线:

else if (((mandalist[randInt][randIntSub]).charAt(0)) == '*'){

我收到一个NullPointerException错误,但无法理解为什么...... Master.mandarray已被转移到mandalist,我可以假设(但这就是我在这里的原因)并且因此检索第一个字符串应该没有问题一个完整的条目,对吗?

问题是系统可能检索到中文字符而不知道如何处理它? 或者是我正在失踪的东西? 谢谢任何可能帮助我的人。你一定会得到学分!

2 个答案:

答案 0 :(得分:1)

问题在于

for (int i = (Master.Mandarray.length-1); i>0 ;i--){

测试i>0在循环体之前完成,因此当i为零时循环不会完成。

这意味着数组的其余元素为null

恕我直言,使用旧的C风格的习语是比较常见的

for (int i = 0; i < Master.Mandarray.length; i++) {

用于循环遍历数组,除非有特殊原因要反向。

答案 1 :(得分:1)

你有很多错误。

错误1:

使用equals()而非==来比较字符串。这一行:

if(mandalist[randInt][randIntSub] == ""){

应该是:

if(mandalist[randInt][randIntSub].equals("")){

或更好:

if(mandalist[randInt][randIntSub].isEmpty()){

错误2:

java数组从零开始;数组的最高索引是length - 1,而不是length,最低的是零,而不是一个,所以你的循环:

for (int i = mandalist.length; i>0 ;i--){

应该是:

for (int i = mandalist.length - 1; i >= 0 ;i--){

错误3(引起您问题的那个):

类似于Bug 2,你的循环没有在索引零处初始化元素,所以它应该是:

for (int i = (Master.Mandarray.length-1); i >= 0 ;i--){ // i >= 0, not i > 0

除非您确实需要循环索引,否则请使用行业标准方法来提升索引:

for (int i = 0; i < Master.Mandarray.length-1; i++){