gpt4 book ai didi

java - Java 中不安全类的 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 13:07:17 25 4
gpt4 key购买 nike

当使用Unsafe.getByte(byte[], long)时或Unsafe.putByte(long, byte[])或 Unsafe 中其他基元类型的任何其他 get/put 方法,我将得到 NullPointerException。这是代码段:

byte[] data = new byte[]{0, 0, 0, 0, 0};
long offset = 0;
Unsafe unsafe = getUnsafe();

public byte at(long index) {
return unsafe.getByte(data, index + this.offset);
}

*所有字段均已正确实例化。
*方法 getUnsafe() 将返回一个 Unsafe 类实例。

最佳答案

如果我尝试您的代码,我会收到 Unsafe.getUnsafe()java.lang.SecurityException 。如果您以某种方式忽略该异常,unsafe 可能最终会变为 null,这可能是导致异常的原因。

如果我使用以下代码来初始化不安全:

Unsafe unsafe = null;

try {
Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (sun.misc.Unsafe) field.get(null);
} catch (Exception e) {
throw new AssertionError(e);
}

一切正常,如果我将 offset 设置为 16,我可以使用您的 at(...) 函数来访问数组中的字节。也许可以尝试一下这个看看是否有帮助。

但是!!!(正如@StephenC上面所说),你应该尽量避免使用这种方法!例如,您可能无法依赖应用于所有虚拟机的 offset 特定值。此外,在某些疯狂的情况下,某些虚拟机甚至可能决定对数组中的字节进行字对齐,因此您需要将 index 增加 4 或 8 才能到达下一个字节(这是猜测)。这个函数可能是高度不可预测的。我还怀疑它比仅使用 data[index] 快得多,因为您刚刚在代码中引入了方法调用。如果您需要速度,请务必查看 direct NIO ByteBuffers .

关于java - Java 中不安全类的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com