java - 在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
课程,最好的方法是什么。
解决方案
鉴于您当前的声明,我将按如下方式进行。
定义一个@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
课程,这都应该可以解决问题。
推荐阅读
- java - 计算字符串出现次数的最佳方式/数据结构
- java - java中元空间区域或permgen的引用在哪里
- python - 如何遍历文本文件的每一行并使用 python 获取这些行的情感?
- android - 防止用户从 android 应用程序的应用程序设置中清除商店首选项。?
- android - 无法解析方法“arrayUnion”-firestore
- java - maven - mvn 测试失败:杀死自我 fork JVM。Maven进程死了
- ios - OPGFeedbackSDK:如何使用 OnePoint SDK 对移动调查进行身份验证?
- c - 为什么我在我自己的第 n 个根的代码中得到这个结果?
- c# - UWP 预定通知,应用关闭后 Toast
- javascript - 丢弃功能内的事件处理程序不起作用