【问题标题】:NullPointerException with lambda expression - working with loops带有 lambda 表达式的 NullPointerException - 使用循环
【发布时间】:2020-09-11 04:24:17
【问题描述】:

我有两段代码,一段是用java老风格写的,另一段是用lambda表达式写的,

第一个:

        Class enumClass = getConstantsEnum();
        Object[] enumConstants  = enumClass.getEnumConstants();
        
        for(Object o:enumConstants) {
            try {
                constantsMap.put(o.toString(),o.getClass().getDeclaredField("lookupValue").getInt(o));
            } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException
                    | SecurityException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

工作正常并正确填充地图

另一个:

        Class enumClass = getConstantsEnum();
        Object[] enumConstants  = enumClass.getEnumConstants();
        constantsMap.putAll(Arrays.asList(enumConstants)
                .stream().collect(Collectors.toMap
                        (e -> e.toString(), e -> {
                            try {
                                return e.getClass().getDeclaredField("lookupValue").getInt(e);
                            } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException
                                    | SecurityException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }finally {
                                return null;
                            }
                        }
                        )));

给出空指针异常,但通过调试 e.getClass().getDeclaredField("lookupValue").getInt(e) 行我看到它被值填充

我的问题是: 1-这段代码有什么问题?

2-如何在 eclipse 中的流方法中有效地调试,有没有办法像在正常循环中一样查看元素在地图中的填充?我可以通过放置断点来查看第一个元素,但随后会立即触发异常

3- 是否有更简洁的方法来处理 lambda 表达式中的异常,我尝试使用 try/catch 包装整个代码,但编译器仍然抱怨未处理异常。

感谢任何问题的回答:)

编辑:

Holger 在 cmets 中回答了 Q1

添加了 IDE

【问题讨论】:

  • 你得到的正是你想要的:finally { return null; }。想想吧。
  • @Holger,好的,但是为什么抛出 NPE 不只是将 null 放入地图值
  • @holger .. gr8,谢谢

标签: eclipse lambda java-8


【解决方案1】:
  1. 正如 Holger 在评论中发表的评论中所述,您可以看到 Java 8 中存在已知错误,状态未解决,因此您无法使用 Collectors.toMap 放置空值,请参阅此处的问题:https://bugs.openjdk.java.net/browse/JDK-8148463

  2. Intellij IDEA 对调试 Java 8 流有很好的支持。查看这篇文章:https://www.baeldung.com/intellij-debugging-java-streams

  3. 不,目前没有,或者我不知道。我对改进代码的建议是提取一种可以处理异常的方法:

       constantsMap.putAll(Arrays.asList(enumConstants)
                                    .stream().collect(
                                         Collectors.toMap(e -> e.toString(), 
                                         this::getInteger
                                     )));
        }
    
        private Integer getInteger(Object e) {
    
            try {
                return e.getClass().getDeclaredField("lookupValue").getInt(e);
            } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException
                    | SecurityException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } finally {
                return null;
            }
        }

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多