Java程序通过main方法的String[] args数组接收命令行参数,按空格分隔、索引从0开始;需注意shell解析差异、无内置选项区分机制,推荐用Picocli等库封装解析并校验。
Java程序接收命令行参数主要通过main方法的String[] args数组实现,这是最基础也最常用的方式。参数按空格分隔,顺序传入数组,索引从0开始。理解其行为边界(如含空格、引号、特殊字符的处理)和合理封装是实际开发的关键。
Java虚拟机在启动时将命令行中java命令后的所有非JVM选项内容,以空格为默认分隔符切分后,逐个存入args数组:
java MyApp a b c → args = ["a", "b", "c"]
java MyApp "hello world" 42 → args = ["hello world", "42"](引号内空格保留)java MyApp -Dkey=value → args = ["-Dkey=value"](-D是JVM系统属性,不会进args;真正进args的是java命令末尾、-cp/--module-path之后的内容)命令行参数解析由操作系统 shell 完成,JVM 不参与分词。这意味着:
args[0]不一定是“主参数”,它只是第一个用户参数,语义由程序自行约定-v)、“长选项”(如--help)或“参数值”(如-o file.txt),需手动解析或借助库""和null不会出现在args中;若需支持可选参数,应显式判断args.length
当参数变多、需支持帮助信息、类型转换、必填校验等时,硬编码解析易出错且难维护。推荐使用成熟命令行解析库:
@Option(names = "-v", description = "verbose mode") boolean verbose;
java.util.spi.ToolProvider构建可插拔工具,但命令行入口仍靠args
避免在main里直接写业务逻辑。推荐做法:
AppCo
nfig),用静态工厂方法fromArgs(String[])解析并校验"Missing required option: -i")并调用System.exit(1)
Integer.parseInt()等并捕获NumberFormatException,不要假设输入合法Paths.get(arg)尽早转为Path,便于后续检查是否存在、是否为目录等