2013-05-11 70 views
1

仍然在同一個項目(基於Java的shell)上工作,並試圖運行它 - 並得到了一個奇怪的錯誤。我正在使用代表其中一個命令的單個類,並且由於學校計算機沒有編譯器,因此我使用ideone。無論如何,我收到了一個錯誤,雖然我之前看到過,但這個位置真的很奇怪。錯誤:奇怪的Java錯誤放置

Main.java:56: error: no enclosing instance of type LIST_Command is in scope 
    public FAKE_CMD(int i) {this.msg = i;System.out.println(i);} 
         ^

不應該在一個地方是調用構造函數,或類的靜態方法嗎?

這裏是代碼(完整的,讓我知道我應該修剪或編輯它自己)是的,這使得它成爲一個SSCCE。

package javashell.ver2.command; 

import java.io.*; 
import java.util.*; 

class LIST_Command { /*extends Command*/ 
    public static Map<String, Command> commands = new HashMap<>(); 

    public String description() { 
     return "List all commands, their descriptions, or usages."; 
    } 

    public String usage() { 
     return "list <cmds | desc | usage>"; 
    } 

    public boolean runCmd(String[] cmdArgs, PrintStream output) { 
     try { 
      if (cmdArgs.length == 0) { 
       return false; 
      } 
      else if (cmdArgs.length > 0) { 
       if (cmdArgs[0].equals("cmds")) { 
        for (Map.Entry<String, Command> cmd : /*main.Main.*/commands.entrySet()) { 
         output.println(cmd.getKey()); 
        } 
       } 
       else if (cmdArgs[0].equals("desc")) { 
        for (Map.Entry<String, Command> cmd : /*main.Main.*/commands.entrySet()) { 
         output.println(cmd.getValue().description()); 
        } 
       } 
      } 
      return true; 
     } 
     catch (Exception e) { 
      return false; 
     } 
    } 

    public static void main(String[] args) { 
     commands.put("test1", new FAKE_CMD(1)); 
     commands.put("test2", new FAKE_CMD(2)); 
     new LIST_Command().runCmd(new String[] {"cmds"}, System.out); 
    } 

    abstract class Command { 
     public abstract String usage(); 
     public abstract String description(); 
     public abstract boolean runCmd(String[] cmdArgs, PrintStream output); 
    } 

    static class FAKE_CMD extends Command { 
     int msg; 
     public FAKE_CMD(int i) { 
      this.msg = i; 
      System.out.println(i); 
     } 
     public String usage() { 
      return "usagetest" + msg; 
     } 
     public String description() { 
      return "descriptiontest" + msg; 
     } 
     public boolean runCmd(String[] cmdArgs, PrintStream output) { 
      return true; 
     } 
    } 
} 
+0

我猜你在某處有'{'或'}'的位置,但代碼格式太差,無法確定。 – 2013-05-11 20:50:33

+1

我真的很想知道學校如何讓學生在不向他們提供基本開發工具的情況下編寫代碼。 – 2013-05-11 20:50:43

+0

@Stefano它不適合學校 - 這是我在學校免費期間工作的個人項目。而且,他們只是在電腦上安裝了Win7,並沒有重新安裝程序 – 2013-05-11 20:52:07

回答

2

FAKE_CMD的構造函數需要調用它的超類'(Command's)的構造函數。但是,由於超類不是static,Java在構造FAKE_CMD之前無法實例化超類實例。

+0

這比Marko更好地解釋了答案,所以一旦有機會我會接受。它也解釋了錯誤的位置。 – 2013-05-11 20:55:41

3

Command是一個內部類,這似乎並沒有因爲它被包含在一個類,應該是它的子類是有道理的。無論如何,這是你的錯誤的原因:無論FAKE_CMD本身是否爲靜態,它需要一個封閉的實例LIST_Command,因爲它擴展了Command

注意在Java中的術語可能的細微之處:內部類意味着非靜態嵌套類,因此它意味着一個類實例的需要。

+0

啊,我明白了。謝謝。 編輯:如果我讓命令也是靜態的,那會解決這個問題嗎? – 2013-05-11 20:51:28

+0

它在一個班級中的全部原因是因爲IDEOne(一個糟糕的網站,但是唯一的選擇)一次只能與一個班級一起工作。這只是爲了測試它。 – 2013-05-11 20:54:06

+0

如果您將'Command'設置爲頂級類別,並且其他類別必須是其嵌套類別,您仍然可以避開它。 – 2013-05-11 20:55:19