Java哈希表错误 - 标识符预期和非法类型的启动?

时间:2012-01-11 16:20:50

标签: java hashtable

这应该是具有多个关键字的简单解释器的一部分,我将其制作成不同的类。该程序应该遍历ArrayList,将字符串标记化并将它们解析为KEYWORD +指令。我正在使用散列映射将所有这些关键字映射到具有类的接口,其中进行其余的处理。目前正在测试其中一个关键字类,但是当我尝试编译时,编译器会抛出“标识符预期”和“非法启动类型”消息。抛出所有错误消息的行是第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 个答案:

答案 0 :(得分:8)

要超越当前的编译器错误,您需要将DirectiveHash.put("END", new endStatement());调用放在某种块中。如果您想在实例初始化程序中使用它,请尝试以下操作:

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

答案 1 :(得分:2)

您的变量名称应以小写字符开头。 DirectiveHash使用变量名称,类/接口名称应以大写字母开头。

答案 2 :(得分:2)

您的DirectiveHash.put("END", new endStatement());应采用某种方法。由于您的课程endStatement是抽象的,因此无法使用new

进行初始化

答案 3 :(得分:1)

诚实地说有几个问题:

  1. endStatement未正确实现Directive作为#execute方法签名 不匹配。

  2. 由于endStatement是抽象的(无法直接实例化),因此无法执行以下操作。

    DirectiveHash.put("END", new endStatement());
    
  3. 这不能在块或方法之外完成。你通常使用一个构造函数:

    DirectiveHash.put("END", new endStatement());
    
  4. 您实际上从未在main中初始化DirectiveHash。请注意,它是类的实例变量,main是静态方法。对于要使用DirectiveHash的main,它必须有一个StringSplit类的实例才能从中获取它。

  5. 以下行有点误导,因为您要分配和实例var名称与类名相同。合法但令人难以置信的阅读和一个非常糟糕的主意。实际上,在这种情况下,由于您没有在#main中实例化DirectoryHash,因此更麻烦。因此,ivar directoryHash(以备用混淆)被设置为指令,我们随后对“DirectiveHash = DirectiveHash.get(...)”的调用将被破坏,因为它意味着调用指令#get,这是不存在的。

    Directive DirectiveHash=DirectiveHash.get(listString[0]);
    
  6. 以下行无效,因为“listString [0]”无效。您将listString声明为for()循环中的String - 而不是数组。

    Directive DirectiveHash=DirectiveHash.get(listString[0]);
    
  7. 您的大小写需要更加严谨...使用类和接口的初始大写以及方法名称和变量的小写首字母。

  8. 嗯,这就像是编译器访谈中的一个。我看到有些人已经发布了这么抱歉。可能也错过了一些......

    您可能需要阅读其中一些问题:

    • 构造
    • 静态方法与实例方法
    • 实施接口
    • 抽象类的目的/用法

答案 4 :(得分:0)

您正在尝试实例化一个抽象类。无法使用new运算符实例化抽象类。

也许您应该扩展endStatement类(并将其重命名为EndStatement)并为其提供具体实现