2013-05-11 48 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