![](/img/trans.png)
[英],Exception in thread "main" java.lang.NullPointerException
[英]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.