Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的初始化顺序:Netty 4.0.7的例外_Java_Static_Netty - Fatal编程技术网

Java中的初始化顺序:Netty 4.0.7的例外

Java中的初始化顺序:Netty 4.0.7的例外,java,static,netty,Java,Static,Netty,我在初始化类时遇到了Netty的问题。我认为静态字段总是在实例字段之前初始化,但显然不是这样: 类AbstractByteBuff包含一个静态最终资源泄漏检测器 类AbstractReferenceCountedByteBuf扩展AbstractByteBuff 类UnmoledUnsafeDirectByTebuf扩展了AbstractReferenceCountedByteBuf 第一次创建未经处理的UnsaleUnsafeDirectByTeBuf时,会在其构造函数中引发空指针异常:

我在初始化类时遇到了Netty的问题。我认为静态字段总是在实例字段之前初始化,但显然不是这样:

  • 类AbstractByteBuff包含一个
    静态最终资源泄漏检测器
  • AbstractReferenceCountedByteBuf扩展AbstractByteBuff
  • UnmoledUnsafeDirectByTebuf扩展了AbstractReferenceCountedByteBuf
第一次创建未经处理的UnsaleUnsafeDirectByTeBuf时,会在其构造函数中引发空指针异常:

protected UnpooledUnsafeDirectByteBuf(ByteBufAllocator alloc, int initialCapacity, int maxCapacity) {
        super(maxCapacity);
        if (alloc == null) {
            throw new NullPointerException("alloc");
        }
        if (initialCapacity < 0) {
            throw new IllegalArgumentException("initialCapacity: " + initialCapacity);
        }
        if (maxCapacity < 0) {
            throw new IllegalArgumentException("maxCapacity: " + maxCapacity);
        }
        if (initialCapacity > maxCapacity) {
            throw new IllegalArgumentException(String.format(
                    "initialCapacity(%d) > maxCapacity(%d)", initialCapacity, maxCapacity));
        }

        this.alloc = alloc;
        setByteBuffer(ByteBuffer.allocateDirect(initialCapacity));
        leak = leakDetector.open(this);
    }

堆栈跟踪表明您的问题:

at io.netty.util.internal.logging.Slf4JLogger.debug(Slf4JLogger.java:76)
at io.netty.util.ResourceLeakDetector.<clinit>(ResourceLeakDetector.java:37)
at io.netty.buffer.AbstractByteBuf.<clinit>(AbstractByteBuf.java:37)
位于io.netty.util.internal.logging.Slf4JLogger.debug(Slf4JLogger.java:76)
位于io.netty.util.ResourceLeakDetector。(ResourceLeakDetector.java:37)
位于io.netty.buffer.AbstractByteBuf.(AbstractByteBuf.java:37)
表示类正在初始化。看起来ResourceLeakDetector在类初始化期间(AbstractByteBuf的类初始化完成并分配leakDetector之前)正在生成日志语句

更新:

在查看整个堆栈跟踪时,最令人困惑的部分可能是,还不清楚还没有发生什么。关键的一点是,
unmoleedunsafedirectbytebuf
的静态类初始化尚未发生!jvm的当前状态为:

  • UnmoledUnsafeDirectByTeBuf分配器正在尝试创建UnmoledUnsafeDirectByTeBuf的新实例
  • 已加载(但未初始化)未启用的UnsaledUnsafeDirectByTeBuf类
  • AbstractReferenceCountedByteBuf类已加载(但未初始化),因为它是UnmoledUnsafeDirectByTeBuf的父类
  • AbstractByteBuf类已加载(但未初始化),因为它是AbstractReferenceCountedByteBuf的父类
  • AbstractByteBuf类初始化开始(因为父类在子类之前初始化),leakDetector仍然为null
  • ResourceLeakDetector类已加载,因为它被AbstractByteBuf类init引用
  • ResourceLeakDetector类初始化开始,其中包括日志语句
  • …进行了一系列其他方法调用
  • unpoliedUnsafeDirectByTeBuf分配器创建unpoliedUnsafeDirectByTeBuf的新实例(这是对此方法的递归调用)
  • 已分配UnpooledUnsafeDirectByteBuf的新实例(该类已加载,但尚未初始化)
  • NullPointerException
  • 如果从ResourceLeakDetector类init中删除日志调用,则会发生以下情况:

  • 同样的
  • 同样的
  • 同样的
  • 同样的
  • 同样的
  • 同样的
  • ResourceLeakDetector类初始化运行到完成
  • AbstractByteBuf类初始化完成,leakDetector现在被分配
  • AbstractReferenceCountedByteBuf类初始化运行到完成
  • unpoliedUnsafeDirectByteBuf类初始化运行到完成
  • unpoliedUnsafeDirectByTeBuf分配器创建unpoliedUnsafeDirectByTeBuf的新实例
  • 生活过得很愉快

  • 如何调用此构造函数?正常的程序流,或者其他类的静态初始化的一部分?如果是这样的话,那么就有问题了。也许你需要确保所有的类都被重新编译?您能显示实际的异常跟踪和泄漏检测器定义吗?可怕的是,如果我一步一步地调试,一切都会正常工作。看起来我遇到了jdk 1.6U25的jvm问题实际异常的堆栈跟踪是什么?添加了stacktrace,谢谢:)我不同意。我实际上是在编写一个记录器,这可能会让人困惑。但原因就在这里:java.lang.NullPointerException at io.netty.buffer.unmoledUnsafeDirectByTebuf.(unmoledUnsafeDirectByTebuf.java:72)@Edmondo1984-可以随意不同意所有您想要的,但答案就在堆栈跟踪中。堆栈跟踪是问题发生时系统的确切状态。AbstractByteBuf生产线37是指定泄漏检测器的生产线。由于分配尚未发生,leakDetector仍然为null。是的,但如果它是在当前类的父类上定义的最后一个静态成员,为什么它为null?@Edmondo1984-因为父类尚未完成类初始化,如堆栈跟踪所示。您有一个循环静态依赖性问题,请参见,例如,为什么没有?你能详细说明你的答案吗?
    at io.netty.util.internal.logging.Slf4JLogger.debug(Slf4JLogger.java:76)
    at io.netty.util.ResourceLeakDetector.<clinit>(ResourceLeakDetector.java:37)
    at io.netty.buffer.AbstractByteBuf.<clinit>(AbstractByteBuf.java:37)