java Main<;inputfile不工作(Main是一个测试ANTLR语法的java类)

java Main<;inputfile不工作(Main是一个测试ANTLR语法的java类),java,error-handling,io,redirect,antlr3,Java,Error Handling,Io,Redirect,Antlr3,我正试图用这样一个标准的测试平台来测试ANTLR语法 import org.antlr.runtime.*; class Main { public static void main(String[] args) throws Exception { SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0])); SampleParser parser = new SampleParser(new

我正试图用这样一个标准的测试平台来测试ANTLR语法

import org.antlr.runtime.*;

 class Main {
  public static void main(String[] args) throws Exception {
    SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0]));
    SampleParser parser = new SampleParser(new CommonTokenStream(lexer));
    parser.program();
  }
}
我有一个名为mytest00的测试文件。现在我想使用这个文件作为输入。我想我在做一个标准的IO重定向

   bash-3.2$ java Main < mytest00

您试图使用
args[0]
,但实际上没有传入任何命令行参数-您只是将文件重定向到进程的标准输入中。所以这个数组没有元素,你会得到一个异常,因为你试图得到这个空数组的第一个元素


还不清楚您是否真正想要
ANTLRStringStream
。我怀疑您想要
antlInputStream
包装
系统。如果
args.length==0
,则
antlInputStream(args[0])
否则。

当您使用
时,异常通常意味着什么以及如何处理异常

at Main.main(SampleTest.java:5)
问题出现在代码的5行中,即:

SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0]));
例外情况是:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
这意味着您正试图从数组
args
中检索0元素,该数组已被非法索引访问,因为该数组为空(size=0)


示例解决方案

您要使用此构造函数:

public ANTLRStringStream(String str)
为此,您可以:

  • 读取一些字符串的标准输入
  • 将此字符串传递给
    ANTLRStringStream
    构造函数

  • 对不起,请你说得更准确一点好吗?我真的抓不住它。你打算怎么办?我想我的程序正在等待arg[0]参数的输入,标准输入是arg[0]将采用的实际值。它不应该这样工作吗??谢谢。@zell:不,它不应该那样工作。程序的标准输入和用于调用它的参数之间有很大的区别。如果您编写了
    javamainfoobar
    ,您希望它做什么?在这种情况下,
    args
    将是
    {“foo”,“bar”}
    。谢谢Jon。但是,将我的输入文件作为ANTLR测试设备的输入,有什么好办法呢?谢谢作为参考,我曾为此目的使用过gunit,但gunit对我来说的问题是它没有提供有用的错误消息。因此,最好是有一个文件作为JAVA Main的直接输入。@zell:正如我在回答中所说的,我怀疑您需要一个
    AntlInputStream
    ,它允许您传入一个文件名,或者您可以使用
    AntlInputStream
    包装
    系统。
    如果您仍然需要stdin重定向。@zell,“ANTLR解释器”你可能是指AntlWorks中的解释器(这只是一个)。然而,AntlWorks的调试器工作得非常完美。
    public ANTLRStringStream(String str)