千家信息网

如何解决Java语法中Lambda表达式无法抛出异常

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"如何解决Java语法中Lambda表达式无法抛出异常"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,
千家信息网最后更新 2026年11月03日如何解决Java语法中Lambda表达式无法抛出异常

本篇内容介绍了"如何解决Java语法中Lambda表达式无法抛出异常"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • Lambda表达式无法抛出异常

    • 1.Demo 例子

    • 2.编译通过

  • lambda表达式异常应该如何处理

    • 我们看一个例子

Lambda表达式无法抛出异常

1.Demo 例子

错误提示 - Unhandled exception: java.io.IOException;

public static void main(String[] args) throws IOException{   Stream.of("a", "b", "c").forEach(str -> {        throw new IOException();   });}

2.编译通过

Stream.of("a", "b", "c").forEach(str -> {    throw new RuntimeException(new IOException());});  // 不建议使用

或者

static  void doThrow(Exception e) throws E {    throw (E)e;}//编译通过Stream.of("a", "b", "c").forEach(str -> {    doThrow(new IOException());});

lambda表达式异常应该如何处理

java 8中引入了lambda表达式,lambda表达式可以让我们的代码更加简介,业务逻辑更加清晰,但是在lambda表达式中使用的Functional Interface并没有很好的处理异常,因为JDK提供的这些Functional Interface通常都是没有抛出异常的,这意味着需要我们自己手动来处理异常。

因为异常分为Unchecked Exception和checked Exception,我们分别来讨论。

处理Unchecked Exception

Unchecked exception也叫做RuntimeException,出现RuntimeException通常是因为我们的代码有问题。RuntimeException是不需要被捕获的。也就是说如果有RuntimeException,没有捕获也可以通过编译。

我们看一个例子

List integers = Arrays.asList(1,2,3,4,5);        integers.forEach(i -> System.out.println(1 / i));

这个例子是可以编译成功的,但是上面有一个问题,如果list中有一个0的话,就会抛出ArithmeticException。

虽然这个是一个Unchecked Exception,但是我们还是想处理一下:

 integers.forEach(i -> {        try {            System.out.println(1 / i);        } catch (ArithmeticException e) {            System.err.println(                    "Arithmetic Exception occured : " + e.getMessage());        }    });

上面的例子我们使用了try,catch来处理异常,简单但是破坏了lambda表达式的最佳实践。代码变得臃肿。

我们将try,catch移到一个wrapper方法中:

static Consumer lambdaWrapper(Consumer consumer) {    return i -> {        try {            consumer.accept(i);        } catch (ArithmeticException e) {            System.err.println(                    "Arithmetic Exception occured : " + e.getMessage());        }    };}

则原来的调用变成这样:

integers.forEach(lambdaWrapper(i -> System.out.println(1 / i)));

但是上面的wrapper固定了捕获ArithmeticException,我们再将其改编成一个更通用的类:

static  ConsumerconsumerWrapperWithExceptionClass(Consumer consumer, Class clazz) {    return i -> {        try {            consumer.accept(i);        } catch (Exception ex) {            try {                E exCast = clazz.cast(ex);                System.err.println(                        "Exception occured : " + exCast.getMessage());            } catch (ClassCastException ccEx) {                throw ex;            }        }    };}

上面的类传入一个class,并将其cast到异常,如果能cast,则处理,否则抛出异常。

这样处理之后,我们这样调用:

ntegers.forEach(                consumerWrapperWithExceptionClass(                        i -> System.out.println(1 / i),                        ArithmeticException.class));

处理checked Exception

checked Exception是必须要处理的异常,我们还是看个例子:

static void throwIOException(Integer integer) throws IOException {    }List integers = Arrays.asList(1, 2, 3, 4, 5);        integers.forEach(i -> throwIOException(i));

上面我们定义了一个方法抛出IOException,这是一个checked Exception,需要被处理,所以在下面的forEach中,程序会编译失败,因为没有处理相应的异常。

最简单的办法就是try,catch住,如下所示:

ntegers.forEach(i -> {            try {                throwIOException(i);            } catch (IOException e) {                throw new RuntimeException(e);            }        });

当然,这样的做法的坏处我们在上面已经讲过了,同样的,我们可以定义一个新的wrapper方法:

static  Consumer consumerWrapper(        ThrowingConsumer throwingConsumer) {    return i -> {        try {            throwingConsumer.accept(i);        } catch (Exception ex) {            throw new RuntimeException(ex);        }    };}

我们这样调用:

integers.forEach(consumerWrapper(i -> throwIOException(i)));

我们也可以封装一下异常:

static  Consumer consumerWrapperWithExceptionClass(            ThrowingConsumer throwingConsumer, Class exceptionClass) {        return i -> {            try {                throwingConsumer.accept(i);            } catch (Exception ex) {                try {                    E exCast = exceptionClass.cast(ex);                    System.err.println(                            "Exception occured : " + exCast.getMessage());                } catch (ClassCastException ccEx) {                    throw new RuntimeException(ex);                }            }        };    }

然后这样调用:

integers.forEach(consumerWrapperWithExceptionClass(                i -> throwIOException(i), IOException.class));

"如何解决Java语法中Lambda表达式无法抛出异常"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

处理 表达式 例子 编译 面的 代码 方法 语法 内容 更多 知识 还是 问题 实用 臃肿 成功 学有所成 接下来 业务 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 厦门中拓互联网络科技有限公司 广州互联网科技公司 九亚互联网科技 北京互联网络科技有限公司 小马过河互联网科技 汇久创客互联网科技 壕鑫互联网络科技 互联网高科技企业 美国互联网前沿科技 无锡溥仪互联网科技有限公司 互联网汽车科技小镇 农村开互联网科技讲堂 顶级互联网科技成果有哪些 互联网企业和科技型企业 中化能源互联网科技招聘 山东子淼互联网科技有限公司 有人说阿里系是互联网科技企业 广州有谷有贝互联网科技有限公司 江苏互联网智能科技产品出厂价 互联网科技的前景 保险科技 互联网保险 互联网 科技公司 互联网金融公司科技 现代科技和互联网有关系吗 广州优美互联网科技 互联网校园科技培训 青岛科技大学互联网大赛研究生 佛山市拉法互联网科技有限公司 萌小萌互联网科技河南有限公司 科技互联网专业务虚会材料
0