«NegativeArraySizeException» - пользовательский загрузчик классов - PullRequest
0 голосов
/ 27 марта 2012

У меня работал загрузчик классов, хотя теперь я получаю сообщение об ошибке после адаптации его к моему новому приложению.Я полагаю, что это потому, что я конвертирую целое число в длинное.

private byte[] loadClassData(String name) {
    try {
        JarInputStream jis = new JarInputStream(new ByteArrayInputStream(dec));
        JarEntry entry = null;
        String entryName = null;
        while((entry = jis.getNextJarEntry()) != null)
        {
            entryName = entry.getName();
            if(entryName.equalsIgnoreCase(name))
            {
                try{
                    classBytes = new byte[(int)entry.getSize()];
                    jis.read(classBytes, 0, classBytes.length);
                    return classBytes;
                }catch(Exception ex){
                    ex.printStackTrace();
                    return null;
                }
            }
        }
        return classBytes;
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
    } catch (Exception ex) {
        ex.printStackTrace();
        System.out.println(ex.getMessage());
    }
    return null;
}

В любом случае, это основа этого.Я получаю сообщение об ошибке "new byte [(int) entry.getSize ()];"part.

"java.lang.NegativeArraySizeException"

Спасибо.

1 Ответ

3 голосов
/ 27 марта 2012

Да, потому что ZipEntry.getSize() может вернуть -1. Даже если он не вернул -1, вы не должны предполагать, что один вызов read прочитает все данные. Вы должны читать в цикле, пока входной поток не вернет -1.

Я предлагаю вам использовать ByteStreams.toByteArray(InputStream) от Гуава для этого.

...