/ / NullPointerException s nebezpečnou triedou v Jave [zatvorené] - java, výnimka

NullPointerException s nebezpečnou triedou v jazyku Java [closed] - java, výnimka

Pri použití Unsafe.getByte(byte[], long) alebo Unsafe.putByte(long, byte[]) alebo akúkoľvek inú metódu get / put pre iné primitívne typy v časti Unsafe, dostanem NullPointerException. Toto je segment kódu:

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);
}

* Všetky polia sú konkretizované správne.
* Metóda getUnsafe () vráti inštanciu triedy Nebezpečné.

odpovede:

1 pre odpoveď č. 1

Ak skúsim váš kód, dostanem a java.lang.SecurityException pre Unsafe.getUnsafe(), Ak túto výnimku nejako ignorujete, unsafe môže skončiť byť null, čo môže byť príčinou vašej výnimky.

Ak namiesto toho inicializujem nasledujúci kód 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);
}

všetko funguje a môžem použiť vaše at(...) funkcie pre prístup k bajtom v poli, ak som nastavil offset až 16. Možno to vyskúšaj a uvidíme, či to pomôže.

ALE!!! (ako už bolo uvedené vyššie v @StephenC), mali by ste sa vyhnúť použitiu tejto metódy! Napríklad sa možno nebudete môcť spoľahnúť na konkrétnu hodnotu offset vzťahujúce sa na všetky VM. V niektorých bláznivých prípadoch sa môžu niektoré virtuálne počítače dokonca rozhodnúť zarovnať bajty vo vašom poli tak, aby ste ich museli zvyšovať. index o 4 alebo 8, aby ste sa dostali k nasledujúcemu bajtu (toto je hádanie). Táto funkcia môže byť veľmi nepredvídateľná. Pochybujem tiež o tom, že je oveľa rýchlejšia než len používanie data[index], pretože ste do svojho kódu práve zaviedli volanie metódy. Ak potrebujete rýchlosť, nezabudnite sa tiež pozrieť priame NIO ByteBuffers.