首页 > 解决方案 > 数组中空指针异常的Java错误处理

问题描述

抱歉,如果这是一个重复的问题,我进行了一些搜索,但找不到我的具体情况。

我想知道如果在 ArrayList 的索引中找不到解析的 ID,我是否可以就处理空异常错误的最佳方法获得一些建议,这些函数尝试通过 ID 从 ArrayList 返回对象。

我有一个包含 Task 对象的 ArrayList 的 Project 类:

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()

try {} catch {}如果我在 Task 类的函数中进行错误处理,则添加一个 块addTag();是可行的,但我宁愿不必遍历 Task 类中的所有函数并添加try {} catch {}到每个函数中。

这个问题有更好的解决方案吗?

标签: javaarraylisterror-handling

解决方案


从 java 8 开始,如果数组返回中存在,则可以Optional用作返回类型,否则为空TaskOptionalTaskOptional

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();
}

可选中,您可以ifPresent通过避免try-catchnull检查来使用

project.getTask(15).ifPresent(t->t.addTag("test"));

推荐阅读