2016-03-28 2 views
-1

Недавно я получил эту ошибку`java.lang.ClassFormatError` список кодов ошибок

Caught: java.lang.ClassFormatError: Illegal field modifier in class **** : 0x3 
java.lang.ClassFormatError : Illegal field modifiers in class **** : 0x3 

Я знаю причину, я задавался вопрос - есть ли какая-то таблица этих кодов ошибок и его объяснение? Потому что мне любопытно, что означает 0x3.

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx – Gendarme

ответ

3

модификаторы полей являются битовые ОШ действительных модификаторов. Каждый из допустимых модификаторов (некоторые из которых показаны в ответе @ gustf) представляют собой целые числа с установленными одиночными битами.

Таким образом, 0x3 будет OR двух модификаторов с числовыми значениями 0x2 и 0x1.

0x2 модификатор средства ACC_PRIVATE. Модификатор 0x1ACC_PUBLIC.

Это противоречие - вы не можете иметь что-то публичное и личное - так что 0x3 является недопустимой комбинацией модификаторов.

Это поведение описано в Section 4.5 of the JVM spec:

Поле классов может установить любого из флагов в таблице 4.4. Тем не менее, определенное поле класса может иметь не более одного из его ACC_PRIVATE, ACC_PROTECTED и ACC_PUBLIC флагов набора ...

Как например, установка ACC_PRIVATE и ACC_PUBLIC явно запрещенные спецификациями.

+0

О, я вижу. Таким образом, код является результатом операции «побитовое ИЛИ». Я понял. Итак, в основном JVM проверяет результат OR для модификаторов поля, чтобы проверить, хороши они или нет? – lapots

+0

@ user1432980 Да. Добавлена ​​ссылка на спецификацию JVM, где она описывает это. –

+0

Таким образом, объединение 'private' и' protected' приведет к '0x5'? – lapots

4

0x3 является недействительным модификатором и имеет противоречивое значение в этом контексте.

В поле не может быть как public, так и private модификатор в то же время.

Допустимые модификаторы

ACC_PUBLIC  0x0001 
ACC_PRIVATE  0x0002 
ACC_PROTECTED 0x0004 
ACC_STATIC  0x0008 
ACC_FINAL  0x0010 
ACC_VOLATILE 0x0040 
ACC_TRANSIENT 0x0080 
ACC_SYNTHETIC 0x1000 
ACC_ENUM  0x4000 

Вы можете прочитать о них here

+1

Это не отвечает на вопрос о том, что означает '0x3'. Ссылка, прокомментированная @Gendarme, делает. – GrizzlyManBear

+1

@GrizzlyManBear не совсем. Это просто описывает кучу численно равных, но несвязанных кодов ошибок. Маловероятно, что 'ERROR_PATH_NOT_FOUND' имеет какое-либо отношение к модификаторам полей класса. –

+2

@GrizzlyManBear: Это потому, что 0x3 является незаконным модификатором, и причина, по которой он получает «ClassFormatError». Ссылка из @Gendarme просто перечисляет полностью несвязанные коды ошибок. – gustf