Eclipse отклоняет мой метод инициализации public void

Eclipse SDK версии 3.2.1 отклоняет мой метод public void init.
Я использую следующие импорты:

import acm.graphics.*;
import acm.program.*;
import acm.util.*;

В моей программе есть метод run() и метод init(), но init() вызывает эти ошибки

- overrides acm.program.Program.init
- Cannot override the final method from Program

Обратите внимание, что это еще не отдельное приложение. Просто запустите его из редактора Eclipse.

По-видимому, в библиотеке acm.program есть метод инициализации. Как реализовать собственный метод инициализации, не пытаясь переопределить встроенный метод acm.program? Я попытался сделать свой метод инициализации закрытым с помощью private void init, но затем получаю:

- Cannot reduce the visibility of the inherited method from Program
- Cannot override the final method from Program 

Вот код до сих пор. Ошибка связана с init().

public class Hangman extends GraphicsProgram {

    //CONSTANTS
private static int NUMBER_OF_INCORRECT_GUESSES = 8;


//Initialize the program
public void init() { //this gives compiler a problem
HangmanCanvas canvas = new HangmanCanvas();
add(canvas);
}



public void run() {

/* Когда пользователь играет в «Виселицу», компьютер сначала случайным образом выбирает секретное слово из списка, встроенного в программу. Затем программа выводит ряд тире — по одному на каждую букву секретного слова — и просит пользователя угадать букву. Если пользователь угадывает букву в слове, слово отображается повторно со всеми экземплярами этой буквы, показанными в правильных позициях, вместе с любыми буквами, правильно угаданными на предыдущих ходах. Если буква не встречается в слове, пользователь обвиняется в неправильном предположении. Пользователь продолжает угадывать буквы до тех пор, пока либо (1) пользователь правильно не угадает все буквы в слове, либо (2) пользователь не сделает восемь неверных предположений. */

HangmanLexicon lexicon = new HangmanLexicon();
RandomGenerator rgen = new RandomGenerator();
int wordIndex = rgen.nextInt(0, lexicon.getWordCount()-1);

    while (true) { //allows multi-play
        int play = 0;
        String answer = readLine ("Want to play?");
        if(answer.equals("Y") || answer.equals("y") || answer.equals("yes") || answer.equals("Yes")) {play = 1;}
        if(play == 0) {break;}
        //Initialize some stuff
        //get new random word
        secretWord = lexicon.getWord(rgen.nextInt(0,wordIndex));
        println("Welcome to Hangman.");
        secretWord = secretWord.toUpperCase(); // convert secret word to upper case
        int length = secretWord.length();
        //reset game variables
        String guess = "";
        //clear the canvas
        canvas.reset();
        //reset the wrong answer count
        wrong = 0;

// создаем пустое слово состояния

        currentWord = ""; //reset the word for multi-play

// строим дефисы в статусном слове такой же длины, как и секретное слово.

        for (int i = 0; i < length; i++) {
            currentWord += "-";
        }
        println("The word looks like this  " + currentWord);

        while (wrong<NUMBER_OF_INCORRECT_GUESSES && !currentWord.equals(secretWord)) {
            guess = ".";
            char g = guess.charAt(0);
            while (!Character.isLetter(g)){ //if input is not a character, keep asking
                guess = readLine("Guess a letter: ");
                guess = guess.toUpperCase();
                g = guess.charAt(0);
                if (!Character.isLetter(g)){println("Your guess is not a single letter. Guess again: ");}
            }
            if(secretWord.indexOf(guess) < 0) {/*if guess is not in the secret word, increment wrong answer count and print message
             to that effect. */
                wrong++;
                println("Threre are no " + guess + "\'s in the word.");
                println("You have " + (NUMBER_OF_INCORRECT_GUESSES - wrong)  + " guesses left.");
            }
            else {
                println("That guess is correct.");
                currentWord = wordBuild(guess);
                if (currentWord.equals(secretWord)) { //if win print win but don't bother with the update to display
                    println("You win! You guessed the word: " + secretWord);}

                    else {  println("The word now looks like this  " + currentWord); //print the updated dash word
                    println("You have " + (NUMBER_OF_INCORRECT_GUESSES - wrong)  + " guesses left.");
                    }           
            }
        }

    if(!currentWord.equals(secretWord)) {println("You lose.");}   //out of guesses and  word is not good.
    }
}

//Построить и/или обновить дефисное слово ------ отображается

    public String wordBuild(String guess) {
        String dashWord = "";
        for (int i = 0; i < secretWord.length(); i++) {
                if(secretWord.charAt(i) == guess.charAt(0)) { 
                dashWord = dashWord + guess;
                }
                    else {dashWord = dashWord + currentWord.charAt(i);
                }
        }
            return dashWord;

    }



//INSTANCE VARS

int wrong = 0;  
String currentWord = "";
String secretWord = "";     
private HangmanCanvas canvas;

} //end of class

person Dana    schedule 17.02.2012    source источник
comment
final методы не могут быть переопределены. Попробуйте добавить конструктор.   -  person 3Dave    schedule 17.02.2012
comment
Покажи свой init метод! Кроме того, убедитесь, что у вас другой пакет, чем acm.   -  person adarshr    schedule 17.02.2012
comment
Опубликуйте больше кода, связанного с проблемой.   -  person kosa    schedule 17.02.2012
comment
Вы действительно должны иметь возможность переопределить acm.program.Program.init(), поскольку в документации, которую я видел, она указана как не окончательная. Я не могу представить, что любая версия класса имеет init() как final, потому что это абстрактный класс, предназначенный для переопределения метода init() всякий раз, когда это необходимо.   -  person Kevin Welker    schedule 17.02.2012


Ответы (1)


Я полагаю, вы проходите курс Stanford CS106A и это вызывает финальную проблему с инициализацией. Проблема в библиотеке Karel.jar, которую вы должны были импортировать во время первых нескольких лекций. Я предполагаю, что библиотека имеет метод init() как окончательный, и это основная причина. Таким образом, простое решение — удалить Karel.jar из справочной библиотеки следующим образом:

  1. В проводнике пакетов выберите Справочные библиотеки.
  2. Щелкните правой кнопкой мыши Karel.jar.
  3. Выберите Путь сборки в контекстном меню.
  4. Выберите Удалить из пути сборки.

Но в случае, если вам нужно снова заняться программированием Karel с помощью Eclipse, вам придется снова импортировать справочную библиотеку из пакета задания 1, следуя аналогичному курсу, но выбрав импорт библиотеки. Чтобы продолжать использовать методы acm, обязательно импортируйте файл acm.jar, загрузив его с сайта jtf. acm.org. Чтобы добавить используемые вами библиотеки, используйте Документация по Eclipse или просто погуглите.

person Akash Kumar Sharma    schedule 04.05.2013