我有一个任务可以将我的throw Exception从main()移动到lambda-expression。这意味着,当Lambda中发生异常时,程序将使用main引发。问题是我无法创建任何其他可以自动执行此操作的接口,因为我的老师说我只使用java.util.Function中的接口,而且我一直在网上寻找,但是大多数情况下都回答“创建”新界面”。
public static void main(String[] args) throws IOException {
Function<String, List<String>> flines = (String x) -> {
Stream<String> streamString = Files.lines(Paths.get(x)); //Should throw Exception from main if IOException
List<String> tmp = streamString.collect(Collectors.toList());
return tmp;
};
答案 0 :(得分:0)
您可以在lambda表达式中捕获IOException
,将其包装在RuntimeException
中,在main
中捕获该异常,提取包装的IOException
并将其抛出:
public static void main(String[] args) throws IOException
{
Function<String, List<String>> flines = (String x) -> {
List<String> tmp = null;
try {
Stream<String> streamString = Files.lines(Paths.get(x));
tmp = streamString.collect(Collectors.toList());
} catch (IOException ioEx) {
throw new RuntimeException (ioEx);
}
return tmp;
};
try {
List<String> lines = flines.apply ("filename.txt");
}
catch (RuntimeException runEx) {
if (runEx.getCause () instanceof IOException) {
throw (IOException) runEx.getCause ();
}
}
}
答案 1 :(得分:0)
您只能抛出未检查的异常,因为Function
在其功能接口的签名中没有声明任何检查的异常。
因此,您只能从lambda主体中显式抛出RuntimeException
(及其子类)实例,例如:
Function<String, List<String>> flines = (String x) -> {
try{
Stream<String> streamString = Files.lines(Paths.get(x));
List<String> tmp = streamString.collect(Collectors.toList());
return tmp;
}
catch (IOException e){
throw new RuntimeIOException(e);
}
};
但是在throws IOException
方法中声明main()
是如此的无助,因为它将永远不会被抛出,但是如果您在Function客户端中捕获了运行时异常,然后重新抛出了{{1 }}。但这很多事情几乎没有。