Ошибки хеш-таблицы Java - ожидаемый идентификатор и недопустимое начало типа? - PullRequest
0 голосов
/ 11 января 2012

Предполагается, что это часть простого интерпретатора с несколькими ключевыми словами, которые я сделал в разных классах.Предполагается, что программа перебирает ArrayList, маркирует строки и разбирает их в инструкции KEYWORD +.Я использую hashmap, чтобы отобразить все эти ключевые слова в интерфейс, в котором есть классы, где происходит остальная обработка.В настоящее время тестируется один из этих классов ключевых слов, но когда я пытаюсь скомпилировать, компилятор выдает сообщения «ожидаемый идентификатор» и «недопустимое начало типа».Строка, в которой отображаются все сообщения об ошибках, - это строка 18. Куда идет код?Я не могу сказать, так как я никогда не использовал HashTable прежде.Спасибо за помощь!

import java.util.*;

public class StringSplit
{
interface Directive //Map keywords to an interface
{
    public void execute (String line);
}
    abstract class endStatement implements Directive
    {
        public void execute(String line, HashMap DirectiveHash)
        {   
            System.out.print("TPL finished OK [" + " x lines processed]");
            System.exit(0);
        }
    }
    private Map<String, Directive> DirectiveHash= new HashMap<String, Directive>();
    DirectiveHash.put("END", new endStatement());

    public static void main (String[]args)
    {
        List <String> myString= new ArrayList<String>();
        myString.add(new String("# A TPL HELLO WORLD PROGRAM"));
        myString.add(new String("STRING myString"));
        myString.add(new String("INTEGER myInt"));
        myString.add(new String("LET myString= \"HELLO WORLD\""));
        myString.add(new String("PRINTLN myString"));
        myString.add(new String("PRINTLN HELLO WORLD"));
        myString.add(new String("END"));


        for (String listString: myString)//iterate across arraylist
        {   
                String[] line = listString.split("[\\s+]",2);
                for(int i=0; i<line.length; i++)
                {
                    System.out.println(line[i]);
                    Directive DirectiveHash=DirectiveHash.get(listString[0]);
                    DirectiveHash.execute(listString);

                }

        }

    }
}

Ответы [ 5 ]

8 голосов
/ 11 января 2012

Чтобы обойти текущую ошибку компилятора, вам нужно поместить вызов DirectiveHash.put("END", new endStatement()); в какой-то блок. Если вы хотите это в инициализаторе экземпляра, попробуйте это:

{ DirectiveHash.put ("END", new endStatement ()); }

2 голосов
/ 11 января 2012

Ваш DirectiveHash.put("END", new endStatement()); должен быть каким-то способом.А поскольку ваш класс endStatement является абстрактным, его нельзя инициализировать с помощью new

2 голосов
/ 11 января 2012

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

1 голос
/ 11 января 2012

Если честно, несколько вопросов:

  1. endStatement неправильно реализует Директиву, поскольку сигнатуры метода #execute не совпадают.

  2. Вы не можете сделать следующее, так как endStatement является абстрактным (не может быть создан непосредственно).

    DirectiveHash.put("END", new endStatement());
    
  3. Это нельзя сделать вне блока или метода.вы обычно используете конструктор:

    DirectiveHash.put("END", new endStatement());
    
  4. На самом деле вы никогда не инициализируете DirectiveHash в main.Обратите внимание, что это переменная экземпляра класса, а main - статический метод.Чтобы main мог использовать DirectiveHash, он должен иметь экземпляр класса StringSplit, чтобы получить его из.

  5. Следующая строка немного вводит в заблуждение, поскольку вы присваиваете имя экземпляра var кактак же, как имя класса.Законно, но адски запутанно читать и действительно плохая идея.На самом деле, в этом случае это более хлопотно, поскольку вы не создали экземпляр своего DirectoryHash в #main.Таким образом, ivar directoryHash (чтобы избежать путаницы) устанавливается в качестве директивы, и наш последующий вызов «DirectiveHash = DirectiveHash.get (...)» прерывается, поскольку это подразумевает вызов Directive # get, который не существует.

    Directive DirectiveHash=DirectiveHash.get(listString[0]);
    
  6. Следующая строка недопустима, поскольку listString [0] недопустима.Вы объявили listString как String в цикле for (), а не в массиве.

    Directive DirectiveHash=DirectiveHash.get(listString[0]);
    
  7. Ваша капитализация должна быть более строгой ... используйте начальные заглавные буквы для классов и интерфейсови строчные инициалы для имен методов и переменных.

Что ж, это было похоже на одно из интервью с компилятором.Я вижу, некоторые из них уже опубликованы, так что сожалею об этом.Возможно, тоже кое-что пропустили ...

Возможно, вам понадобится прочитать некоторые из этих вопросов:

  • Конструкторы
  • Статические методы и методы экземпляров
  • Реализация интерфейсов
  • Назначение / использование абстрактных классов
0 голосов
/ 11 января 2012

вы пытаетесь создать экземпляр абстрактного класса. абстрактные классы не могут быть созданы с помощью оператора new.

возможно, вам следует расширить класс endStatement (а также переименовать его в EndStatement) и предоставить для него конкретную реализацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...