2012-01-11 61 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。

那麼,這就像你是編譯器訪談的人之一。我看到有些已經發布,所以很抱歉。可能已經錯過了一些...

您可能需要閱讀各地的一些問題:

  • 構造
  • 靜態方法與實例方法
  • 實現接口的
  • 用途/使用抽象類