Java程序通过main方法的String[] args数组接收命令行参数,按空格分隔、索引从0开始;需注意shell解析差异、无内置选项区分机制,推荐用Picocli等库封装解析并校验。

Java程序接收命令行参数主要通过main方法的String[] args数组实现,这是最基础也最常用的方式。参数按空格分隔,顺序传入数组,索引从0开始。理解其行为边界(如含空格、引号、特殊字符的处理)和合理封装是实际开发的关键。
基础用法:args数组直接解析
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 不参与分词。这意味着:
- Windows CMD 和 PowerShell、Linux bash/zsh 对引号、转义的处理略有差异,需在目标环境测试
-
args[0]不一定是“主参数”,它只是第一个用户参数,语义由程序自行约定 - 没有内置机制区分“选项”(如
-v)、“长选项”(如--help)或“参数值”(如-o file.txt),需手动解析或借助库 - 空字符串
""和null不会出现在args中;若需支持可选参数,应显式判断args.length
进阶方案:使用Apache Commons CLI或Picocli
当参数变多、需支持帮助信息、类型转换、必填校验等时,硬编码解析易出错且难维护。推荐使用成熟命令行解析库:
立即学习“Java免费学习笔记(深入)”;
-
Picocli:零依赖、注解驱动、自动生帮助文档、支持子命令,适合现代Java应用。示例:
@Option(names = "-v", description = "verbose mode") boolean verbose; - Apache Commons CLI:老牌稳定,API稍冗长但文档丰富,适合对依赖敏感的场景
- Java 9+ 可考虑
java.util.spi.ToolProvider构建可插拔工具,但命令行入口仍靠args
实用建议:参数封装与验证
避免在main里直接写业务逻辑。推荐做法:
- 定义一个参数配置类(如
AppConfig),用静态工厂方法fromArgs(String[])解析并校验 - 解析失败时输出清晰错误(如
"Missing required option: -i")并调用System.exit(1) - 对数值型参数用
Integer.parseInt()等并捕获NumberFormatException,不要假设输入合法 - 路径类参数建议用
Paths.get(arg)尽早转为Path,便于后续检查是否存在、是否为目录等










