线程" main"中的例外情况java.lang.NullPointerException(Java,Netbeans)

时间:2014-11-23 01:54:07

标签: java netbeans multidimensional-array compare


public static void main(String[] args) {
    String[][] alunos = new String[100][2];
    String[][] grelhaAvaliacao = null;
    double classificacoes[][] = null;
    int op, numAl = 0;
    do {
        op = menu();
        switch(op) {
            case 1:
                numAl = carregarFicheiro(alunos, numAl);
                break;
            case 2:
                numAl = lerInformação(alunos, numAl);
                break;
            case 3:
                escreverFicheiroAlunos(alunos, numAl);
                break;
            case 0:
                break;
            default:
                System.out.println("Introduza uma opção válida!");
                break;
        }
    } while(op != 0);
}

public static int lerInformação(String[][] alunos, int numAl) {
    do {
        System.out.print("Nome do Aluno: ");
        alunos[numAl][0] = ler.next();
        System.out.print("Número do Aluno: ");
        ler.nextLine();
        alunos[numAl][1] = ler.next();
        numAl++;
    } while(numAl < alunos.length && (!alunos[numAl][0].equalsIgnoreCase("FIM")));
    return numAl;
}

  

输出:   菜单:   1.Carregar ficheiro alunos   2.InserirInformaçõesparaAlunos   3.Gravaralteraçõesaoficeiro alunos   4.Carregar ficheiro Grelha   5.Mostrar Grelha   6.Inseririnformaçõesdecotação   7.Mostrarinformaçãocompleta   8.Nota final&gt; = 50%   9.Apresentar HTML   0.Sair
  说明:2
  Nome do Aluno:joao santos   NúmerodoAluno:1140296   线程“main”中的异常java.lang.NullPointerException at   aplicação_final.Aplicação_Final.lerInformação(Aplicação_Final.java:73)     ataplicação_final.Aplicação_Final.main(Aplicação_Final.java:23)   Java结果:1 BUILD SUCCESSFUL(总时间:8秒)


  

所以这是我的问题伙伴,那个错误。我知道这是因为   而声明,在这部分完全   (!alunos [numAl] [0] .equalsIgnoreCase(“FIM”))我只是不明白   为什么,这是一个我必须为学校计划的计划,它有更多   功能,但这里不需要它们我相信自从   错误就在那里,这个方法lerInformaçao,基本上要求用户   输入学生的姓名,然后询问他的学号(   学生的)它将一个保存在二维数组的第0列   第1列中的另一部分,我从那时起提到的部分   当用户输入单词时,语句应该结束读数   FIM(以葡萄牙语结尾),但它会导致错误,任何想法?

1 个答案:

答案 0 :(得分:0)

!alunos[numAl][0].equalsIgnoreCase("FIM"))永远无法评估您的需求。在评估条件时,alunos[numAl][0]始终检查NULL条目,因为您已递增numAl。 YODA条件为您做了一些不同的原因是因为“FIM”不等于NULL,这意味着!"FIM".equalsIgnoreCase(alunos[numAl][0]);将始终求值为TRUE,因此循环仅基于.length()条件继续。< / p>

试试这个:

public static int lerInformação(String[][] alunos, int numAl) {
do {
    System.out.print("Nome do Aluno: ");
    alunos[numAl][0] = ler.next();
    System.out.print("Número do Aluno: ");
    ler.nextLine();
    alunos[numAl][1] = ler.next();
    numAl++;
} while(numAl < alunos.length && (!alunos[numAl-1][0].equalsIgnoreCase("FIM"))); //numAl - 1, instead.
return numAl;

}

使用numAl - 1您要检查最近的用户输入,这是在您增加numAl之前发生的。但是,更好的解决方案是:

public static int lerInformação(String[][] alunos, int numAl) {
do {
    System.out.print("Nome do Aluno: ");
    alunos[numAl][0] = ler.next();
    if(alunos[numAl][0].equalsIgnoreCase("FIM") {
      break;
    }
    System.out.print("Número do Aluno: ");
    ler.nextLine();
    alunos[numAl][1] = ler.next();
    numAl++;
} while(numAl < alunos.length);
return numAl;
}

这样,一旦用户输入FIM,就不会继续运行不必要的代码(例如提示Numero do Aluno)。 break将立即退出循环。

但是,您仍然必须解决在用户生成的alunos数组中存储命令(FIM)这一事实,这是不好的做法。您可以解决此问题,以便将相关代码更新为:

 String userInput = ler.next();
    if(userInput.equalsIgnoreCase("FIM") {
      break;
    }
    else {
     alunos[numAl][0] = userInput;
    }