TL; DR: Переместить весь кодовый блок внутри функции; эта проблема перестала бы существовать немедленно.
Единственное, что вы можете сделать с переменной вне тела метода / функции, это инициализировать ее, но даже при этом вам нужно сделать это в той же строке, в которой вы объявили переменную. Вы сталкиваетесь с этой проблемой, потому что пытаетесь выполнять реальные операции вне функционального блока. Давайте рассмотрим каждый подход один за другим ...
Первый подход:
String [] method1 = new String [] {"one","two","three"};
Приведенный выше подход работает просто отлично, потому что вы выполняете объявление и инициализацию в в то же время. Здесь не нарушено ни одно правило.
Второй подход:
String [] method2; //<------ "Syntax error on token ";", { expected after this token"
method2 = new String[3]; // Doesn't work in this postion
method2[0] = "one";
method2[1] = "two";
method2[2] = "three";
Во второй строке вы выполняете операцию с переменной, которую вы объявили в предыдущей строке. Это не может быть сделано вне функции. Следовательно, ошибка.
Третий подход:
String [] method3 = new String[3]; //<------- No issue, works fine in this position
method3[0] = "one";
method3[1] = "two";
method3[2] = "three";
Ожидается, что этот третий пример будет работать хорошо. И вот почему: первая строка представляет допустимый способ объявления и инициализации переменной. Несмотря на то, что последующие строки являются инициализацией элементов массива, они по-прежнему считаются допустимыми способами инициализации переменных, поскольку элементы массива в этом контексте рассматриваются как независимые объекты.
Помните, что ключевым моментом здесь является обеспечение того, чтобы весь код после декларации был заключен в тело метода / функции.