【问题标题】:Errors in evaluation of ClassName.EnumNameClassName.EnumName 评估错误
【发布时间】:2015-10-09 20:06:16
【问题描述】:

我有一个类说 ClassX 定义了枚举。像这样

public class ClassX{
    public enum XType {
        E_1, E_2, E_3, E_TC, UN_KNOWN, N_ONE;
    }
}

在另一个类的方法(methodx)中,我指的是枚举并将其分配给另一个变量,如下所示:

public class AnotherClass{
    public class NestedClass {
        // some member variables
        public NestedClass(String x, CustomClass y) {
            this.m1 = x;
            this.m2 = y;
            this.b1 = false;
            this.b2 = false;
        }
    }

    public SomeType methodx() {
        XType xt = null;
        try {
            // print log stmt1
            xt = XType.E_TC;
            // print log stmt2
        }
        catch(Exception e) {
            // print log stmt3
        }
    }
}

问题是我在日志中得到了日志 stmt1。但是在那之后不要从 methodx() 中得到任何东西。

我花了几个小时试图找出问题所在。日志没有被打印出来,也没有抛出/捕获任何异常。然后,我附加了调试器。在赋值之前放置断点。当断点被命中时,我将 XType.E_TC 添加到监视列表中。 令我惊讶的是,它说<Errors Evaluating>。我仍然继续前进,代码跳转到methodx()上方的子类块的构造函数块!

这对我来说没有意义,因为类已正确编译并且类已正确加载。我通过单独执行“javap”检查了XType,没有错误。

你以前见过这样的事情吗? 如何解决这个问题? 为什么会发生这样的事情?我的意思是我可以理解 ClassX 的 .class 文件是否部分构建并且没有 XType 的定义,这是合理的。但是类定义和枚举被正确编译到.class中。如上所述,我使用 javap 命令进行了验证。

非常感谢任何帮助和指点!

【问题讨论】:

  • 你描述的行为非常奇怪。可能是您在某个地方有一个或多个陈旧的类文件——您可以尝试通过执行项目的完全重建来解决这个问题。但是,如果您需要我们提供任何具体帮助,则需要发布 MCVE。
  • 约翰,我很确定,如果我将上述示例设为可编译状态,我将不会收到我发布的问题。那将是非常基本的 Java 功能,会被破坏。我需要知道可能的原因以及任何可能帮助我隔离问题的工具或流程的指针。我相信一旦确定了根本原因,解决方案就会很简单。
  • 请在您的问题中更加准确。更加详细一些。尽可能缩短您的问题。
  • Bartlomiej,我相信我的问题很简短(考虑到手头的问题)。我已经提供了相关信息和代码sn-p。我已经询问了与该问题相关的具体问题。没有绒毛。我在这里缺少什么吗?我想知道是否有人遇到过类似的“奇怪”行为,我想知道这种行为发生的原因和解决方法。我已经完成了基本的调试并观察了正在发生的事情。这种情况不能用编程基础来证明。所以我很困惑,想知道我是否做错了什么或设置不正确。
  • 正如约翰之前提到的,这“非常奇怪”。正如他所建议的那样,我将在重建所有内容后重新检查并确认不存在过时的类。

标签: java enums variable-assignment


【解决方案1】:

"It may be that you have one or more stale class files somewhere" 看起来确实是最可能的原因:您的代码已编译但在运行时链接错误(可能带有一些剩余的目标文件)。

更详细地探索应用程序在断点命中的状态:如果 XType 被加载,从哪个位置,它的外观,如果来自该编译单元的其他实体存在(添加一个进行测试,看看它是否出现在运行时)。或者,您可以在另一个目录中进行干净构建并查找运行时状态的差异。

【讨论】:

    【解决方案2】:

    问题是依赖类在类路径上不可用。 在这种情况下,我希望 ClassNotFoundException。但由于 JBoss EAP6 服务器已知的原因,它在“TRACE”级别打印。

    当我在类路径上提供正确的 jar 文件时,它没有给我任何错误。

    我仍然无法协调这样一个事实,即当找不到类时,JBoss EAP 服务器选择在 TRACE 中报告它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-27
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2020-04-21
      • 1970-01-01
      相关资源
      最近更新 更多