Java哈希表错误--需要标识符并且类型的开头非法?

Java哈希表错误--需要标识符并且类型的开头非法?,java,hashtable,Java,Hashtable,这应该是一个带有几个关键字的简单解释器的一部分,我将其制作成不同的类。程序应该迭代ArrayList,标记字符串并将其解析为关键字+指令。我使用hashmap将所有这些关键字映射到一个有类的接口,其余的处理都在这个接口上进行。目前正在测试这些关键字类中的一个,但当我尝试编译时,编译器会抛出“预期标识符”和“非法启动类型”消息。抛出所有错误消息的行是第18行。代码哪里去了?我不知道,因为我以前从未使用过哈希表。谢谢你的帮助 import java.util.*; public class Str

这应该是一个带有几个关键字的简单解释器的一部分,我将其制作成不同的类。程序应该迭代ArrayList,标记字符串并将其解析为关键字+指令。我使用hashmap将所有这些关键字映射到一个有类的接口,其余的处理都在这个接口上进行。目前正在测试这些关键字类中的一个,但当我尝试编译时,编译器会抛出“预期标识符”和“非法启动类型”消息。抛出所有错误消息的行是第18行。代码哪里去了?我不知道,因为我以前从未使用过哈希表。谢谢你的帮助

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);

                }

        }

    }
}
import java.util.*;
公共类StringSplit
{
接口指令//将关键字映射到接口
{
公共作废执行(字符串行);
}
抽象类endStatement实现指令
{
public void execute(字符串行,HashMap DirectiveHash)
{   
系统输出打印(“TPL完成正常[“+”x行处理]”;
系统出口(0);
}
}
private-Map-DirectiveHash=new-HashMap();
put(“END”,new endStatement());
公共静态void main(字符串[]args)
{
List myString=new ArrayList();
add(新字符串(“TPL HELLO WORLD程序”);
add(新字符串(“字符串myString”);
add(新字符串(“整数myInt”);
add(新字符串(“让myString=\'helloworld\”);
add(新字符串(“PRINTLN myString”);
add(新字符串(“PRINTLN HELLO WORLD”);
添加(新字符串(“结束”);
for(String-listString:myString)//遍历arraylist
{   
String[]line=listString.split(“[\\s+]”,2);

对于(int i=0;i变量名应以小写字符开头。DirectiveHash用于变量名,类/接口名应以大写字母开头。

若要克服当前编译器错误,需要将
DirectiveHash.put(“END”,new endStatement());
在某类块内调用。如果要在实例初始值设定项中调用,请尝试以下操作:

{ put(“END”,new endStatement());
}您的
DirectiveHash.put(“END”,new endStatement());
应该在某种方法中。由于您的类
endStatement
是抽象的,因此不能使用
new
初始化它。您正在尝试实例化一个抽象类。不能使用
new
操作符实例化抽象类


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

  • endStatement未正确实现指令,因为#execute方法签名 不匹配

  • 您不能执行以下操作,因为endStatement是抽象的(不能直接实例化)

  • 这不能在块或方法之外完成。您通常会使用构造函数:

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

  • 下面这一行有点误导,因为您将实例变量名指定为与类名相同。这是合法的,但读起来非常混乱,这是一个非常糟糕的主意。实际上,在这种情况下,由于您没有在#main中实例化DirectoryHash,所以更麻烦。因此,ivar DirectoryHash(以避免混淆)被设置为一个指令,我们随后对“DirectiveHash=DirectiveHash.get(…)”的调用被中断,因为它意味着调用不存在的指令#get

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

    Directive DirectiveHash=DirectiveHash.get(listString[0]);
    
  • 您的资本化需要更加严格……类和接口使用大写字母,方法名和变量使用小写字母

  • 好吧,那就像是一个你是编译器的采访。我看到一些已经发布了,对此非常抱歉。可能也错过了一些

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

    • 建设者
    • 静态方法与实例方法
    • 实现接口
    • 抽象类的目的/用法

    哪一行给出了编译错误?这可能是一个很好的起点。好的,那么这是第18行。哪一行是第18行?(是的,我可以数一数。我只是想指出,当你已经知道哪一行失败时,粘贴整个程序有点适得其反。)我强烈建议您使用Java命名约定:不,
    DirectiveHash
    只是一个变量。
    Directive
    是接口的名称。这仍然会导致很多问题……我的观点5如下。您还有一个错误,
    endStatement
    类没有实现
    public void execute(字符串行);
    因为您用一个额外的参数定义它。您也不能用
    new endStatement()
    实例化一个
    abstract
    类,因为它是抽象的。
    Directive DirectiveHash=DirectiveHash.get(listString[0]);