奇怪的Java错误放置

时间:2013-05-11 20:46:59

标签: java compiler-errors

仍在处理同一个项目(基于Java的shell)并试图运行它 - 并且遇到了一个奇怪的错误。我正在使用代表其中一个命令的单个类,并且由于学校计算机没有编译器,我使用ideone。无论如何,我收到了一个错误,虽然我以前见过它,但这个位置真的很奇怪。错误:

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);}
                           ^

这不应该在CALLING构造函数的地方,或类的静态方法吗?

这是代码(完整地,让我知道我应该修剪或编辑它自己)是的,这使它成为一个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;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

Command是一个内部类,它似乎没有意义,因为它包含在一个应该是它的子类的类中。无论如何,这是导致错误的原因:无论FAKE_CMD本身是否为静态,它都需要LIST_Command的封闭实例,因为它扩展了Command

请注意Java术语中可能的细微之处:内部类表示非静态嵌套类,因此它意味着需要一个封闭的实例。

答案 1 :(得分:2)

FAKE_CMD的构造函数需要调用它的超类'(Command')构造函数。但是,由于超类不是static,因此Java无法在构造FAKE_CMD之前实例化超类实例。