当对Unsafe中的其他原始类型使用Unsafe.getByte(byte[], long)Unsafe.putByte(long, byte[])或任何其他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类实例。

===============>>#1 票数:1

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

如果我改为使用以下代码初始化unsafe

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上面所述),您应避免使用此方法! 例如,您可能无法依赖应用于所有VM的特定offset值。 此外,在某些疯狂的情况下,某些VM甚至可能决定对数组中的字节进行字对齐,因此您需要将index递增4或8才能到达下一个字节(这是一个猜测)。 此功能可能非常难以预测。 我还怀疑它比仅使用data[index]快得多,因为您刚刚在代码中引入了方法调用。 如果需要速度,还请确保直接查看NIO ByteBuffers

  ask by Laxenade translate from so

未解决问题?本站智能推荐: