2012-01-11 151 views
0

这应该是一个简单的解释器的一部分,有几个关键字,我把它们分成了不同的类。该程序应该遍历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); 

       } 

     } 

    } 
} 
+0

哪一行给出编译错误?这可能是一个很好的起点。 – 2012-01-11 16:25:53

+0

错误在第18行 – Luinithil 2012-01-11 16:28:11

+1

好的,所以它是第18行。哪一行是第18行? (是的,我可以指望,我只是想指出,当你已经知道线路故障时粘贴你的整个程序会有些反作用。) – 2012-01-11 16:29:23

回答

8

为了避免您当前的编译器错误,您需要将DirectiveHash.put("END", new endStatement());调用放入某种类型的块中。如果你想在实例初始值设定项中使用它,请试试这个:

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

+3

你有另一个错误,因为你正在使用一个额外的参数定义'endStatement'类没有实现'public void execute(String line);'。你也不能用'new endStatement()'实例化'abstract'类,因为它是* abstract *。 – jbindel 2012-01-11 16:28:53

2

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

+0

不,'DirectiveHash'只是一个变量。 'Directive'是接口的名称。 – 2012-01-11 16:28:09

+0

谢谢,代码并不容易打扰! – 2012-01-11 16:31:30

+0

而这仍然导致了很多问题......我的观点在下面5。 – wmorrison365 2012-01-11 17:33:38

2

你的DirectiveHash.put("END", new endStatement());应该在某些方法。由于你的课endStatement是抽象的,它不能被初始化使用new

0

你正试图实例化一个抽象类。抽象类不能使用new运算符实例化。

也许你应该扩展endStatement类(和其重命名为),并提供一个具体的实现它

1

几个问题要诚实:

  1. endStatement不正确执行指令作为#execute方法签名 不匹配。

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

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

    DirectiveHash.put("END", new endStatement()); 
    
  4. 你从来没有真正在主初始化DirectiveHash。请注意,它是类的一个实例变量,main是一个静态方法。主要使用DirectiveHash,它必须有一个StringSplit类的实例来获取它。

  5. 下面一行有点让人误解,因为您将var名称分配和实例名称与类名称相同。法律,但地狱混乱阅读和一个非常糟糕的主意。实际上,在这种情况下,由于您没有在#main中实例化DirectoryHash,所以更麻烦。因此,ivar目录哈希(为了避免混淆)被设置为一个指令,我们随后调用“DirectiveHash = DirectiveHash.get(...)”会中断,因为它意味着调用指令#get,该指令不存在。

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

    Directive DirectiveHash=DirectiveHash.get(listString[0]); 
    
  7. 你的资本需要更加rigourous ...使用的类和接口和小写字母首字母大写方法名称和VAR。

那么,这就像你是编译器访谈的人之一。我看到有些已经发布,所以很抱歉。可能已经错过了一些...

您可能需要阅读各地的一些问题:

  • 构造
  • 静态方法与实例方法
  • 实现接口的
  • 用途/使用抽象类