1

まだ同じプロジェクト (Java ベースのシェル) に取り組んでいて、それを実行しようとしましたが、奇妙なエラーが発生しました。私はコマンドの 1 つを表す単一のクラスで作業していましたが、学校のコンピューターにはコンパイラがないため、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);}
                           ^

これは、コンストラクターまたはクラスの静的メソッドを呼び出している場所にあるべきではありませんか?

そして、これがコードです (全体として、自分でトリミングまたは編集する必要があるものを教えてください) はい、これで 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;
        }
    }
}
4

2 に答える 2

3

Commandサブクラスであるべきクラスに含まれているため、意味がないように思われる内部クラスです。とにかく、それがエラーの原因です。FAKE_CMDそれ自体が static であるかどうかに関係なく、LIST_Commandextends であるため、 を囲むインスタンスが必要Commandです。

Java の用語の微妙な点に注意してください。内部クラス非静的なネストされたクラスを意味するため、それを囲むインスタンスが必要であることを意味します。

于 2013-05-11T20:50:54.543 に答える
2

のコンストラクターは、そのスーパークラス ' ( 's) コンストラクターFAKE_CMDを呼び出す必要があります。Commandただし、スーパークラスは ではないためstatic、Java には を構築する前にスーパークラスのインスタンスをインスタンス化する方法がありませんFAKE_CMD

于 2013-05-11T20:51:44.983 に答える