Синтаксическая ошибка Java ArrayList вне основного класса - PullRequest
1 голос
/ 20 июня 2019

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

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

public static void main(String[] args) {

// omitted game setup code, ArrayList has been imported

}

public class hangMen{

    // here is where the error occurs
            // all of the lines below show a syntax error
            // All the lines have Syntax error on token ";" & ".", @ expected


    List<String> stage = new ArrayList<String>();
    stage.add("-------");
    stage.add("|     |");
    stage.add("|");
    stage.add("|");
    stage.add("|");
    stage.add("|");
    stage.add("|___________");}

// В последней строке есть синтаксическая ошибка, вставьте ")" для завершения объявления метода, вставьте идентификатор для завершения MethodHeaderName, вставьте "SimpleName" для завершения полного имени

Я никогда не видел такого раньше, и мой учитель тоже растерялся. Любая помощь?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Конструктор

Image of cookie-cutter

A class is a template defined at compile-time to be used at runtime for instantiating objects. Like a cookie-cutter is a template for stamping out a series of cookies.

Each time your app makes another object, another HangMen game in this case, you may need some set-up work to be done to get that object ready for work. This work is usually done in a конструктор метод. Конструктор - это специальный метод, имя которого совпадает с именем класса. Конструктор также отличается тем, что в нем не указано возвращаемое значение; все остальные методы должны указывать тип возвращаемого значения или указывать void, в то время как конструктор не делает ни того, ни другого. Платформа Java гарантирует, что конструктор будет работать до полного завершения до , когда объект будет введен в эксплуатацию.

Вы можете думать о конструкторе как об этом моменте, вырезая печенье, где вы можете его украсить. Только после того, как оформление завершено, вы кладете печенье на блюдо, которое нужно съесть, например, готовите объект, который нужно запустить.

Подсказка: я считаю полезным пометить мои методы конструктора строкой комментария. Облегчить сканирование при чтении кода.

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

Чтобы сохранить список строк для использования после начальной конструкции, определите переменную как поле члена в классе.

И, кстати, в современной Java вам не нужно повторять < String > на ArrayList, так как компилятор может это выяснить.

Обязательно изучите и соблюдайте соглашения об именах Java. Имя класса должно начинаться с заглавной буквы. Так что HangMen, а не hangMen. Напротив, переменные, содержащие ссылку на объект (экземпляр), начинаются со строчной буквы.

public class HangMen{

    // ----|  Members  |------------------------
    private List< String > stage ;

    // ----|  Constructor  |------------------------
    public HangMen() {

        this.stage = new ArrayList<>() ;
        stage.add("-------");
        stage.add("|     |");
        stage.add("|");
        stage.add("|");
        stage.add("|");
        stage.add("|");
        stage.add("|___________");}

    }

    public void report() {
        System.out.println( "stage: " ) ;
        System.out.println( this.stage.toString() ) ;
    }

}

Давайте попробуем этот класс в методе main.

HangMen hangMen = new HangMen() ;  // Invokes your constructor implicitly. At runtime, the class `HangMen` (note the uppercase `H`) is used to create a new instance (new object). A reference to the object is assigned to the variable named `hangMen` (note the lowercase `h`).
hangMen.report() ;                 // Invokes the `report` method for this instance (this object). 

Обратите внимание на вариант использования this.stage против stage. this. дает понять, что вы имеете в виду переменную-член, а не локальную переменную. Компилятор обычно может определять самостоятельно, когда вы ссылаетесь на переменную-член в сравнении с локальной переменной. В предыдущие годы я предпочитал использовать this., чтобы сделать чтение кода достаточно ясным. Но теперь IDE s с их функциями окраски предоставляют визуальную подсказку, какие переменные являются членами по сравнению с локальными. Поэтому вы можете пропустить префикс this.. Я показал оба здесь в качестве примера.

Совет. Для ясности не помещайте метод main в свой класс HangMen. Поместите его в другой класс с именем типа App в своем собственном файле .java. Метод main - это, по сути, необходимое зло, просто не-объектно-ориентированный взлом, чтобы запустить наши объектно-ориентированные небеса из холодного и жестокого мира аппаратного обеспечения, операционных систем и консолей командной строки. Разделение и в основном игнорирование метода main может помочь в изучении Java.

public class App {
    public static void main( String[] args ) {
        HangMen hangMen = new HangMen() ;  // Invokes your constructor implicitly. At runtime, the class `HangMen` (note the uppercase `H`) is used to create a new instance (new object). A reference to the object is assigned to the variable named `hangMen` (note the lowercase `h`).
        hangMen.report() ;                 // Invokes the `report` method for this instance (this object). 
    }
}
1 голос
/ 20 июня 2019

Ваш код должен быть внутри блока. Это не может быть прямо внутри класса.

Предполагая, что это инициализация, вы можете поместить add s в блок инициализатора:

List<String> stage = new ArrayList<String>();

{  // Add
  stage.add("-------");
  stage.add("|     |");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|___________");
} // Add

, но использование блоков инициализатора довольно необычно. Помещение инициализации внутри конструктора эквивалентно использованию инициализатора, но это более обычное место для «сложной» инициализации:

List<String> stage = new ArrayList<String>();

hangMen() {
  stage.add("-------");
  stage.add("|     |");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|___________");
}

Кроме того, вы можете объявить метод:

List<String> stage = buildStage();

List<String> buildStage() {
  List<String> stage = new ArrayList<>();
  stage.add("-------");
  stage.add("|     |");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|___________");
}

Но я бы просто использовал Arrays.asList для объявления списка встроенным:

List<String> stage = new ArrayList<>(Arrays.asList(
    "-------",
    "|     |",
    "|",
    "|",
    "|",
    "|",
    "|___________"));
...