0

この質問はより具体的で明確になると思います。

これは、単純なオートコンプリート操作(一種)を行う私のコードです。

public class JLineExample {
    public static void main(String[] args) throws IOException {
        String line;
        ConsoleReader console = new ConsoleReader();
        console.setPrompt("> ");

        // Quit
        Completer quit = new StringsCompleter("quit");

        // Group #1
        Completer start = new StringsCompleter("start");
        Completer stop = new StringsCompleter("stop");

        // Group #2
        Completer propetry = new StringsCompleter("property");
        Completer hide = new StringsCompleter("hide");

        // Joint groups
        Completer executionGroup = new ArgumentCompleter(start, stop);
        Completer propertyGroup = new ArgumentCompleter(propetry, hide);
        Completer jointGroups = new ArgumentCompleter(executionGroup, propertyGroup);

        // Aggregator
        Completer aggregated = new AggregateCompleter(quit, jointGroups);

        console.addCompleter(aggregated);
        while ((line = console.readLine("> ")) != null) {
            if ("quit".equals(line.trim())) exit(1);
        }
    }
}

問題は、コンプリータを 1 つのグループにまとめることです。私は得る

Exception in thread "main" java.lang.NullPointerException
        at jline.console.completer.ArgumentCompleter$AbstractArgumentDelimiter.delimit(ArgumentCompleter.java:283)
        at jline.console.completer.ArgumentCompleter.complete(ArgumentCompleter.java:116)
        at jline.console.completer.ArgumentCompleter.complete(ArgumentCompleter.java:152)
        at jline.console.completer.AggregateCompleter$Completion.complete(AggregateCompleter.java:121)
        at jline.console.completer.AggregateCompleter.complete(AggregateCompleter.java:80)
        at jline.console.ConsoleReader.complete(ConsoleReader.java:3261)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2621)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2269)
        at com.test.jline.JLineExample.main(JLineExample.java:52)

TABキーを押したとき。

この動作を修正するにはどうすればよいですか?

4

1 に答える 1

1

コンプリータをコンソール コンプリータに設定しなかったため、null ポインタ例外が発生しています。

次のいずれかを行います。

Vector<String> wc = new Vector<String>();

wc.add("start");
wc.add("stop");
wc.add("load");
wc.add("clear");

console.addCompleter(
    new StringsCompleter(wc)
); 

または、外部ファイルから構築して StringsCompleter コンストラクターにロードするか、次のようにストリームすることができます。

console.addCompleter(
    new StringsCompleter(
        IOUtils.readLines(new GZIPInputStream(ConsoleDemo.class.getResourceAsStream("wordlist.txt.gz")))
    )
);

これはhttps://jeszysblog.wordpress.com/2012/04/14/readline-style-command-line-editing-with-jline/からの単なる例です

単語ファイルはApache Commons IOライブラリによってロードされますが、メモリに完全にロードされている場合、トークンのファイルはそれほど大きくないため、Java I/Oによっても実行できます。それ以外の場合は、トークンを別々のセットに分割してそれぞれをロードする必要があります必要なときに 1 回。

于 2015-12-20T16:25:37.367 に答える