Java哈希表错误 - 标识符预期和非法类型的开始?
这应该是一个简单的解释器的一部分,有几个关键字,我把它们分成了不同的类。该程序应该遍历ArrayList,标记字符串并将它们解析为KEYWORD +指令。我使用散列映射将所有这些关键字映射到具有类的接口,其中处理的其余部分发生。目前正在测试这些关键字类之一,但是当我尝试编译时,编译器会抛出“标识符预期”和“非法类型”消息。抛出所有错误信息的行是第18行。代码乱七八糟的地方在哪里?我不知道,因为我从来没有使用过HashTable。谢谢您的帮助!Java哈希表错误 - 标识符预期和非法类型的开始?
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);
}
}
}
}
为了避免您当前的编译器错误,您需要将DirectiveHash.put("END", new endStatement());
调用放入某种类型的块中。如果你想在实例初始值设定项中使用它,请试试这个:
{ DirectiveHash.put(“END”,new endStatement()); }
你有另一个错误,因为你正在使用一个额外的参数定义'endStatement'类没有实现'public void execute(String line);'。你也不能用'new endStatement()'实例化'abstract'类,因为它是* abstract *。 – jbindel 2012-01-11 16:28:53
您的变量名称应该以小写字符开头。 DirectiveHash使用变量名称,类/接口名称应该以大写字母开头。
不,'DirectiveHash'只是一个变量。 'Directive'是接口的名称。 – 2012-01-11 16:28:09
谢谢,代码并不容易打扰! – 2012-01-11 16:31:30
而这仍然导致了很多问题......我的观点在下面5。 – wmorrison365 2012-01-11 17:33:38
你的DirectiveHash.put("END", new endStatement());
应该在某些方法。由于你的课endStatement
是抽象的,它不能被初始化使用new
你正试图实例化一个抽象类。抽象类不能使用new
运算符实例化。
也许你应该扩展endStatement
类(和其重命名为),并提供一个具体的实现它
几个问题要诚实:
endStatement不正确执行指令作为#execute方法签名 不匹配。
-
由于endStatement是抽象的(无法直接实例化),因此无法执行以下操作。
DirectiveHash.put("END", new endStatement());
-
这不能在块或方法之外完成。你通常会使用一个构造函数:
DirectiveHash.put("END", new endStatement());
你从来没有真正在主初始化DirectiveHash。请注意,它是类的一个实例变量,main是一个静态方法。主要使用DirectiveHash,它必须有一个StringSplit类的实例来获取它。
-
下面一行有点让人误解,因为您将var名称分配和实例名称与类名称相同。法律,但地狱混乱阅读和一个非常糟糕的主意。实际上,在这种情况下,由于您没有在#main中实例化DirectoryHash,所以更麻烦。因此,ivar目录哈希(为了避免混淆)被设置为一个指令,我们随后调用“DirectiveHash = DirectiveHash.get(...)”会中断,因为它意味着调用指令#get,该指令不存在。
Directive DirectiveHash=DirectiveHash.get(listString[0]);
-
以下行无效,因为“listString [0]”无效。您将listString声明为for()循环中的字符串 - 而不是数组。
Directive DirectiveHash=DirectiveHash.get(listString[0]);
你的资本需要更加rigourous ...使用的类和接口和小写字母首字母大写方法名称和VAR。
那么,这就像你是编译器访谈的人之一。我看到有些已经发布,所以很抱歉。可能已经错过了一些...
您可能需要阅读各地的一些问题:
- 构造
- 静态方法与实例方法
- 实现接口的
- 用途/使用抽象类
哪一行给出编译错误?这可能是一个很好的起点。 – 2012-01-11 16:25:53
错误在第18行 – Luinithil 2012-01-11 16:28:11
好的,所以它是第18行。哪一行是第18行? (是的,我可以指望,我只是想指出,当你已经知道线路故障时粘贴你的整个程序会有些反作用。) – 2012-01-11 16:29:23