[英]Java error handling for null pointer exception in array
對不起,如果這是一個重復的問題,我做了一些搜索,但找不到我的具體情況。
我想知道如果在 ArrayList 的索引中找不到解析的 ID,我是否可以得到一些關於處理空異常錯誤的最佳方法的建議,這些函數嘗試通過 ID 從 ArrayList 返回一個對象。
我有一個 Project 類,它有一個 Task 對象的 ArrayList:
private ArrayList<Task> tasks = new ArrayList<Task>();
並且我在 Project 類中有一個獲取函數來嘗試通過它的 ID 從 ArrayList 返回一個任務:
public Task getTask(int id) {
if(id > 0 && id <= tasks.size()) {
for(Task task : tasks) {
if(task.getID() == id) {
return task;
}
}
} else {
Globals.log("Couldt find Task with ID of: " + id + " in Project: " + title);
}
return null;
}
當我嘗試通過從 ID 獲取任務來調用任務中的函數時,如果任務 ID 不存在於 ArrayList 的索引中,我自然會得到一個空異常錯誤,例如,如果沒有任務 ID 為15、此代碼將失敗並返回空異常指針:
project.getTask(15).addTag("Test");
我的問題是,我可以在getTask(int id)
函數中進行一些錯誤處理以在程序崩潰之前記錄錯誤嗎?
我已經嘗試在它周圍添加一個try {} catch {}
塊,但它在崩潰之前仍然沒有運行我的Globals.log()
函數。
如果我在addTag();
進行錯誤處理,則添加try {} catch {}
塊會起作用addTag();
Task 類中的函數,但我寧願不必遍歷 Task 類中的所有函數並將try {} catch {}
到每個函數。
這個問題有更好的解決方案嗎?
從 java 8 開始,如果Task
存在於數組中,則可以使用Optional
作為返回類型 return Optional
with Task
else empty Optional
public Optional<Task> getTask(int id) {
if(id > 0 && id <= tasks.size()) {
for(Task task : tasks) {
if(task.getID() == id) {
return Optional.of(task);
}
}
}
Globals.log("Couldt find Task with ID of: " + id + " in Project: " + title);
return Optional.empty();
}
從Optional 中,您還可以通過避免try-catch
和null
檢查來使用ifPresent
project.getTask(15).ifPresent(t->t.addTag("test"));
我認為Deadpool解決了 NPE 問題,但您的代碼中還有另一個輕微的疏忽。
如果在 ID 沒有按順序排序的情況下,那么您首先檢查if(id > 0 && id <= tasks.size())
將導致問題,將其刪除將是一個好主意:
public Optional<Task> getTask(int id) {
for (Task task : tasks) {
if (task.getID() == id) {
return Optional.of(task);
}
}
Globals.log("Couldt find Task with ID of: " + id + " in Project: " + title);
return Optional.empty();
}
在這種情況下不要使用 try/catch。
在像這樣使用它之前,您需要檢查 getTask 方法是否返回 NULL 值:
public void test() {
Task task = project.getTask(15);
if (task != null) {
task.addTag("Test");
}
}
嘗試這個
Task taskObj=null;
for(Task task : tasks) {
if(task.getID() == id) {
taskObj= task;
}
}
if(taskObj!=null)
{
return null;
}else{
Globals.log("Couldt find Task with ID of: " + id + " in Project: " + title);
return null;
}
}
public void mainClass() {
Task task = project.getTask(15);
if (task != null) {
task.addTag("Test");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.