【问题标题】:NoClassDefFoundError when implementing a UnaryOperator as an anonymous class将 UnaryOperator 实现为匿名类时出现 NoClassDefFoundError
【发布时间】:2021-06-15 16:22:26
【问题描述】:

我解决的问题如下:

给定一个非负整数列表,返回一个整数列表 最右边的数字。

rightDigit([1, 22, 93]) → [1, 2, 3] rightDigit([16, 8, 886, 8, 1]) → [6, 8, 6, 8, 1] rightDigit([10, 0]) → [0, 0]

问题本身很简单,我用单行流操作解决了。

return nums.stream().map(e -> e % 10).collect(Collectors.toList());

但是,为了测试我对匿名类的理解,我决定使用匿名类来实现这一点,提出的是:

public List<Integer> rightDigit(List<Integer> nums) {
    nums.replaceAll(new java.util.function.UnaryOperator<Integer>() {
        public Integer apply(Integer n) {
            return  new Integer(n.intValue() % 10);
        }
    });  
    return nums;
}

我的问题是我遇到了 NoClassDefFoundError 错误,并且无法自行解决。我会很感激知道我在这里做错了什么,谢谢。

【问题讨论】:

  • 你能把完整的stacktrace放到哪个类没有找到吗?
  • 无法复制。为我工作。在您的案例中找不到什么类? Exception in ... java.lang.NoClassDefFoundError: 在你的情况下,冒号后面是什么?
  • @AxelRichter 这是来自codingbat.java网站的问题,他们的编译错误仅限于NoClassDefFoundError:Shell$1,并且无法打印堆栈跟踪。我认为这个错误一定与该特定网站的 Java 环境有关
  • 请注意,replaceAll 不等同于流操作(并且该更改与您从 lambda 表达式更改为匿名内部类无关)。

标签: java collections java-8 functional-programming


【解决方案1】:

它编译正确。

看起来 UnaryOperator 的定义不在您的类路径中。

您能否分享一下:完整的堆栈跟踪,java --version 以及您如何编译和运行它。

【讨论】:

  • 这是来自codingbat.java网站的一个问题,他们的编译错误仅限于NoClassDefFoundError:Shell$1,并且无法打印堆栈跟踪。我认为这个错误一定与该特定网站的 Java 环境有关。
  • @Gestalt Shell$1 看起来与匿名内部类一模一样。所以这确实是那个环境的问题。
  • @Holger 感谢您的确认。知道他们可能会遇到什么问题,还是用如此有限的信息来猜测它是不是一个“黑匣子”?
  • @Gestalt 我们只能做出有根据的猜测。这可能类似于“运行编译器,复制生成的类文件,从目标位置运行应用程序”或动态变体,“运行编译器,手动读取类文件并创建运行时类,使用该类”。我刚刚尝试了该站点,它似乎对class 关键字进行了天真的检查,拒绝包含它的源,但不考虑interfaceenum 或匿名类……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多