簡體   English   中英

線程“ main”中的異常java.lang.NullPointerException(Java,Netbeans)

[英]Exception in thread “main” java.lang.NullPointerException (Java, Netbeans)


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çõespara Alunos 3.Gravaralteraçõesao ficeiro alunos 4.Carregar ficheiro Grelha 5.Mostrar Grelha 6.Inseririnformationaçãesdecotação7.Mostrarinformationaçãocompleta 8.Nota final> = 50% 9,Apresentar HTML 0.Sair
意見:2
Nome do Aluno:joao santosNúmerodo Aluno:1140296線程“ main”中的異常java.lang.NullPointerException,位於aplicação_A_main_Result.Aplica[o_final.Aplica] :1個成功建立(總時間:8秒)


所以這是我有問題的人,那個錯誤。 我知道這是因為while語句,在這一部分中恰好是(!alunos [numAl] [0] .equalsIgnoreCase(“ FIM”))我只是不明白為什么,這是我必須為學校編程的程序,它具有更多功能,但我不需要,在這里我認為因為錯誤在那里,這種方法lerInformaçao基本上要求用戶輸入學生的姓名,然后詢問他的學校編號(該學生的),這樣可以節省一個二維數組的第0列和第1列中的另一個,當用戶輸入單詞FIM(以葡萄牙語結尾)時,我從while語句中提到的那部分應該結束讀取,但是這會導致該錯誤,任何想法?

!alunos[numAl][0].equalsIgnoreCase("FIM"))永遠不會評估您想要的方式。 評估條件時, alunos[numAl][0]始終檢查NULL項,因為您已增加numAl YODA條件對您來說有所不同的原因是因為“ FIM”不等於NULL,這意味着!"FIM".equalsIgnoreCase(alunos[numAl][0]); 將始終計算為TRUE,因此循環僅基於.length()條件繼續。

嘗試這個:

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)的alunos ,這是不正確的做法。 您可以解決將相關代碼更新為以下內容的問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM