代码之家  ›  专栏  ›  技术社区  ›  osama yaccoub

lambda表达式中的NullPointerException-使用循环

  •  0
  • osama yaccoub  · 技术社区  · 4 年前

    我有两段代码,一段是用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包装整个代码,但编译器仍然抱怨没有处理异常。

    欢迎回答任何问题:)

    编辑:

    Q1由Holger在评论中回答

    已添加IDE

    0 回复  |  直到 4 年前
        1
  •  0
  •   Ionut S.    4 年前
    1. 正如Holger在评论中发布的评论所述,您可以看到Java 8中存在一个已知的bug,其状态未解决,因此您无法使用Collectors.toMap将null值放入其中,请参阅此处的问题: 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;
                }
            }