【问题标题】:Java exception stacktrace has "$8", what does this mean? [duplicate]Java异常堆栈跟踪有“$ 8”,这是什么意思? [复制]
【发布时间】:2020-10-09 18:18:59
【问题描述】:

所以这不是我第一次看到异常消息,但我很好奇堆栈跟踪中特殊字符的含义。我在 Android 中使用 Java,这个异常在类名旁边显示一个 $8,然后是发生异常的方法名。

我正在研究,但无法找到任何有关其含义的信息。下面是堆栈跟踪和我指的$8

java.lang.Exception: Error, server response 400
    at cb.cheneytracker.service.callers.ServerCaller$8.onResponse(ServerCaller.java:858)
    at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)

所以更准确地说,因为我在“需要细节或清晰度”方面被否决了。 $ 在上面的异常堆栈跟踪中是什么意思。我看到$8$1$1,这些是什么意思?

【问题讨论】:

    标签: java exception


    【解决方案1】:

    它是匿名类的自动生成名称,它是8,因为容器类中至少有8个匿名类,你可以在这里看到它的作用:

    
        interface Test {
            void doSomething();
        }
        public static Test createTest() {
            return new Test() {
                @Override
                public void doSomething() {
                    System.out.println("I'm busy...");
                }
            };
        }
        public static Test createAnotherTest() {
            return new Test() {
                @Override
                public void doSomething() {
                    System.out.println("Ok");
                }
            };
        }
        public static void main(String[] args) {
            Test t = createTest();
            System.out.println(t.getClass().getName());
    
            t = createAnotherTest();
            System.out.println(t.getClass().getName());
        }
    

    【讨论】:

      【解决方案2】:

      据我所知,它是编译器自动生成的匿名类的名称

      【讨论】:

      • 我认为这样的事情在起作用,但我在任何地方都找不到对此的参考。也许我在网上搜索错误的东西?
      • @Dayan 3.8 节中的 Java 语言规范允许将美元符号作为标识符的一部分,但表示它只能用于机械生成的代码中。匿名内部类的原始规范说 $ 用于生成内部类的名称。在本文档中搜索“美元”:Inner Classes Specification
      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2020-06-26
      • 2011-11-09
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多