Подтвердить что ты не робот

Как исправить "Код метода.. превышает предел 65535 байт"?

У меня есть следующий код:

public static void main(String[] args) {
    try {
        String[] studentnames = {
            /* this is an array of 9000 strings... */
        };
    }
}

При попытке компиляции я получаю следующую ошибку:

The code of method main(String[]) is exceeding the 65535 bytes limit
4b9b3361

Ответ 1

В java методы не могут иметь более 65535 байт.

Итак, чтобы устранить эту проблему, разбейте свой метод main(String[] args) на несколько вспомогательных методов.

Ответ 2

Код ошибки кажется вполне понятным.

The code of method main(String[]) is exceeding the 65535 bytes limit 

Это связано с тем, что в Java существует произвольный жесткий код для 64-битных размеров. (И на самом деле многие другие вещи ограничены 64 КБ, такие как имена методов, количество констант и т.д. См. спецификации Java 8 или спецификации Java 7 для более подробной информации.)

Чтобы обойти это, все, что вам нужно сделать, это разбить ваш метод main(String[] args) на несколько под-методов.


Но почему бы просто не загружать имена из файла?

Некоторые из проблем, с которыми вы делаете это сейчас, - это:

  • во-первых, вы детали жесткого кодирования, что почти всегда плохо (см. this);

  • во-вторых, вы получаете это сообщение об ошибке; и

  • В-третьих, вы затрудняете чтение кода.

Есть еще много, конечно, но это очевидные.

Ответ 3

Инициализация массива studentnames подсчитывается по размеру основного метода. Поскольку есть 9000 имен учеников, каждое имя может содержать только около 7 символов, прежде чем вы исчерпаете место. Как утверждали другие, вам необходимо уменьшить размер метода. Вы можете разбить его на части, как сказал Прамод, но в этом случае основная часть метода - это фактически данные. Я бы сделал так, как сказал Infiltrator, и разделил имена на отдельный файл и просто прочитал его в основном. Что-то вроде commons-io можно использовать, чтобы эффективно использовать ту же позицию, с которой вы начинаете.

List<String> namelist = FileUtils.readLines(new File("studentnames.txt"));
String[] studentnames = namelist.toArray(new String[0]);

Вам может быть полезно обработать список, а не преобразовать его в массив, или, альтернативно, вы можете использовать LineIterator вместо

LineIterator it = FileUtils.lineIterator(file);
try {
     while (it.hasNext()) {
         String line = it.nextLine();
         // do something with line
     }
 } finally {
     it.close();
 }

Ответ 4

Я бы прочитал имена учеников из файла, но одна работа вокруг, которая сделает класс меньшим, а также

String[] studentnames= "Student names is an array of :9000".split(" ");

Вместо определения и использования 9000 строк используется только одно. Предел для одной строки составляет чуть более 2 миллиардов.

Ответ 5

Вы слишком длинный.

Создайте различные методы, чтобы разбить его и сделать его более читаемым и настраиваемым.

Ответ 6

Код метода main (String []) превышает предел 65535 байтов

Как говорится в вашей ошибке, основной метод превышает предел 65535 байт.

Причина: Почему мы получили эту ошибку в нашем коде?

  • Мы знаем, что распределение памяти для массива будет выполняться последовательно. то есть; память будет выделена для массива, если такой объем памяти будет постоянно доступен в оперативной памяти.
  • Мы использовали массив String, который содержит несколько строк "9000", которые слишком велики для хранения в памяти
  • В течение этого времени у ОЗУ не было бы такого огромного пространства, поэтому мы могли бы получить эту ошибку.

Решение: Итак, что я могу сделать для этого?

  • Для хранения такого огромного размера мы можем предпочесть файл для чтения/записи - чтобы мы могли читать часть файла при необходимости
  • Мы можем хранить эти строки в ArrayList, который увеличивает свою память, когда элемент добавляется к нему вместо того, чтобы первоначально выделять память на целое.

Ответ 7

Просто выделите строки из вашего кода на один файл *.properties/xml/json. Netbeans и/или Eclipse могут сделать это для вас легко.

Ответ 8

    public static void main(String[] args) {
        int[] num ={100001,100002,.......,...};

suppose the array 'num' contains 100000 numbers , and your 'main' function gives an error .
In such scenario , you can split the above array in two parts .
Now,you can  declare 2 different array instead of just single array. For example, say

    static int[] num1 ={ }; and static int[] num2={};
decalre num1 outside of main function and num2 insdie the main function
where num2 will replace num inside the main function.

so all elements of array num will be divided in two subarray num1 and num2; 
divide  in such way that both static and non static array could hold say 8000,2000 elements.

the code inside main method  to handle all 10000 elements , an assumption only.
        if (n <= 8000) {
            System.out.println(" --->  " + num2[((int) n - 1)]);
        } else if (n > 8000 && n <= 10000) {
            n = n - 8000;
            System.out.println(" --->  " + num1[((int) n - 1)]);
        }
    }


so splitting that array or say dividing the elements in two parts of 8000 and rest to 2000 , could remove the error .

**solution number 2**: 

Put the array outside 'main' method, both num1 and num2 are now static array but the 65535 bytes limit holds also, for static initialised array and . 
Split your elements, for example, you can split 10000 in 8000 and 2000, or as per you requirement in two static arrays outside the main method !!.

this error is related to storage of elements in long[] or int[] where the error occurs if the storage size surpass the limit 65535.
so in such scenario go splitting the elements for example if you are using long[],int[] split them in suitable numbers till the error get resolved.
in other words it is not mandate you only divide to 2 times , you can divide them in 4 different sizes also or different equal parts ,But again the solution to your problem may vary  as per your requirement !.