簡體   English   中英

數組中空指針異常的Java錯誤處理

[英]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-catchnull檢查來使用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.

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