当前位置: 首页 > 知识库问答 >
问题:

JAVAlang.NullPointerException:使用try/catch创建列表时的格式化程序

楚乐逸
2023-03-14

我有一个CustomerRepository类:

public class CustomerRepository {

    private static final String FILE_PATH = "src/poly/customer/data.txt";

    public List<AbstractCustomer> customers;

    {
        try {
            customers = readFiles();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");

    public List<AbstractCustomer> readFiles() throws IOException{
        List<AbstractCustomer> result = new ArrayList<>();
        List<String> lines = Files.readAllLines(Path.of(FILE_PATH));
        for (String line : lines) {
            String[] parts = line.split(";");
            int points = Integer.parseInt(parts[3]);
            LocalDate date = LocalDate.parse(parts[4], formatter);
            if (parts[0].equals("REGULAR")) {
                RegularCustomer customer = new RegularCustomer(parts[1], parts[2], points, date);
                result.add(customer);
            } else if (parts[0].equals("GOLD")) {
                GoldCustomer customer = new GoldCustomer(parts[1], parts[2], points);
                result.add(customer);
            } else {
                throw new IOException();
            }
        }
        return result;
    }

我想从文件中读取客户,然后将他们添加到客户列表中。我试着这样做:

{
        try {
            customers = readFiles();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这给了我java。lang.NullPointerException:formatter,我该如何解决这个问题?这个方法应该从文本文件中创建对象,然后将它们添加到客户列表中。我的文本文件如下所示:

REGULAR; c1; Alice; 0; 2022-03-10

有规律的c2;上下快速移动0;2022-01-04

黄金;c3;卡罗尔;0;

共有1个答案

锺离飞尘
2023-03-14

问题是您的实例初始化器(带有tr/catch语句的块)在formatter的字段初始化器之前执行,因此formatter仍然为空。

我怎么能解决这个问题?

只需将formatter的声明(包括初始化)移到实例初始值设定项上方即可。。。但我建议使用构造函数来初始化客户,而不是使用实例初始值设定项块,从而使代码更易于理解。

我还建议将formatter设置为一个静态字段-DateTimeFormatter是不可变且线程安全的。不管怎样,您将其存储在最后一个字段中,那么为什么要为每个实例创建一个新字段呢?(这本身就可以解决问题,但出于可读性考虑,我仍然建议使用普通的构造函数声明。)

 类似资料:
  • 问题内容: 好的,这可能是一个非常愚蠢的问题,但是我发现关于此的PHP文档以及一些Internet搜索并没有使我对此有所任何了解。 什么时候应该使用try-catch块来改进我的应用程序? 我读过有人说我们应该仅使用try- catch块来防止致命错误。我读过别人的话说,我们应该只在意外错误上使用它(等什么?意外?如果它们是意外错误,如何使用try- catch防止它们出现?我应该将所有应用程序代

  • 我让我的学长给我解释,他说, 这是为了防止生产中的崩溃。 我完全不同意。对我来说,这不是防止应用程序崩溃的方法。这表明开发人员不知道他/她在做什么,并有疑问。 由于这个问题得到了很多关注,有些人误解了这个问题(可能是因为我没有清楚地表达它),我打算重新表达它。 以下是开发人员在这里所做的 > 编写并测试一个函数,它可以是一个只是初始化视图的小函数,也可以是一个复杂的函数,测试后它被包裹在块中。即使

  • 问题内容: 我有一个JavaScript函数,该函数创建具有3行2单元格的表。 谁能告诉我如何使用我的函数创建下表(我需要针对我的情况进行此操作)? 这是下面给出的我的javascript和html代码: 问题答案: 这应该起作用(对上面的代码进行一些改动)。

  • 问题内容: 我们都使用多个插入查询。这样做时,应该将其放置在内部还是包裹起来?甚至有必要在交易出现问题时自动将交易失败的情况包括在内吗? 包装交易的样本: 相反,包装try … catch: 或只是一笔没有交易的交易…抓住 问题答案: 如果您需要通过代码手动“退出”交易(通过异常还是只是检查错误状态),则不应使用,而是将代码包装在and /中: 请参阅交易文档。

  • 问题内容: 我需要在C#中创建一个SQL格式化程序。谁能指出我在网上的一些资源?我需要实现一个成熟的解析器,还是有一个更简单的方法来实现呢? 问题答案: 看一下 在C#中解析SQL代码 也看一下 SQL漂亮打印机