从Lambda表达式中的main()引发IOException

时间:2018-11-02 09:13:47

标签: java function exception lambda

我有一个任务可以将我的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;

  };

2 个答案:

答案 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 }}。但这很多事情几乎没有。