首页 > 解决方案 > 在java中出现异常后继续的更好方法

问题描述

假设我必须从文件中读取,然后从中构造一个 java 对象。

PersonData p = new PersonData();
p.setName(readTokenAsString());
p.setAge(AgeConverter.createFromDateOfBirth(readTokenAsString()));  // this throws a checked exception if the date of birth is mal-formed.

//... a list of methods that throws exception as AgeConverter

我想要的行为:如果一个属性有问题,忽略它并继续处理其他属性。

我能想到的解决方案:

try {
  p.setAge1(...);
} catch (Exception e) {
  //log and ignore
}

try {
  p.setAge2(...);
} catch (Exception e) {
  //log and ignore
}

//repeat for each attribute

问题:

有没有更好的方法来避免重复?功能风格可能吗?

a)如果我不能修改PersonData类,最好的方法是什么。
b)如果我可以重写PersonData课程,最好的方法是什么。

标签: javaormexception-handlingfunctional-programming

解决方案


鉴于您当前的声明,我将按如下方式进行。

定义一个@FunctionalInterface可以传递 I/O 逻辑的对象:

@FunctionalInterface
public interface CheckedSupplier<T> {
    T getValue() throws Exception;
}

定义一个使用的实用程序方法@FunctionaInterface

public static final <T> T getValueWithDefault(CheckedSupplier<T> supplier, T defaultValue) {
    try {
        return supplier.getValue();
    } catch (Exception e){
        return defaultValue;
    }
}

使用实用程序方法如下:

PersonData p = new PersonData();
p.setName(getValueWithDefault(() -> readTokenAsString(), "default"));
p.setAge(getValueWithDefault(() -> AgeConverter.createFromDateOfBirth(readTokenAsString()), 0));

无论您是否要修改PersonData课程,这都应该可以解决问题。


推荐阅读