Java中的初始化顺序:Netty 4.0.7的例外
我在初始化类时遇到了Netty的问题。我认为静态字段总是在实例字段之前初始化,但显然不是这样:Java中的初始化顺序:Netty 4.0.7的例外,java,static,netty,Java,Static,Netty,我在初始化类时遇到了Netty的问题。我认为静态字段总是在实例字段之前初始化,但显然不是这样: 类AbstractByteBuff包含一个静态最终资源泄漏检测器 类AbstractReferenceCountedByteBuf扩展AbstractByteBuff 类UnmoledUnsafeDirectByTebuf扩展了AbstractReferenceCountedByteBuf 第一次创建未经处理的UnsaleUnsafeDirectByTeBuf时,会在其构造函数中引发空指针异常:
- 类AbstractByteBuff包含一个
静态最终资源泄漏检测器
- 类
AbstractReferenceCountedByteBuf扩展AbstractByteBuff
- 类
UnmoledUnsafeDirectByTebuf扩展了AbstractReferenceCountedByteBuf
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的当前状态为:
如何调用此构造函数?正常的程序流,或者其他类的静态初始化的一部分?如果是这样的话,那么就有问题了。也许你需要确保所有的类都被重新编译?您能显示实际的异常跟踪和泄漏检测器定义吗?可怕的是,如果我一步一步地调试,一切都会正常工作。看起来我遇到了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)