Java中的不安全类的NullPointerException

时间:2014-04-20 00:06:43

标签: java exception

在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 个答案:

答案 0 :(得分:1)

如果我尝试使用您的代码,我会java.lang.SecurityException获得Unsafe.getUnsafe()。如果您以某种方式忽略该异常,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);
}

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

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