java中main方法的args数组接收命令行参数,执行java myapp -u admin --port 8080 "log dir" -v时,args为["-u", "admin", "--port", "8080", "log dir", "-v"];args永不为null但长度可为0,访问前须校验长度,推荐用picocli等库解析而非手写循环。

Java 中 main 方法通过 String[] args 接收命令行输入,它只拿到 java 命令和类名之后的原始字符串,按空格(或制表符)切分,不做任何解析——引号、等号、短选项合并全靠你自己处理或借助工具。
args 到底包含哪些内容
执行 java MyApp -u admin --port 8080 "log dir" -v 时,args 是:
"-u""admin""--port""8080"-
"log dir"(引号在 shell 层起作用,Java 里只剩这个完整字符串) "-v"
注意:args 永远不为 null,长度可为 0;java MyApp → args.length == 0,不是错误,只是没传参。
常见陷阱与避坑要点
- 不要写
if (args == null)—— 这段判断永远不执行,纯属冗余 - 访问
args[0]前必须检查args.length > 0,否则抛ArrayIndexOutOfBoundsException - 参数含空格必须用双引号包裹,如
"config file.json";单引号无效,Windows 下反斜杠需转义(如a^ b) -
--name=alice是一个完整字符串,不会自动拆成键和值;-abc也不会自动展开为-a -b -c
怎么安全解析参数(别手写 for 循环)
手动遍历 args 容易漏参数、混淆位置/命名参数、忽略重复项。推荐用成熟库:
-
picocli:主流首选,支持注解(如
@Option(names = {"-p", "--port"}) int port;),自动类型转换、校验、帮助文本生成,零依赖 - Apache Commons CLI:较老但稳定,适合简单场景
- 避免用
System.getProperty()读命令行参数——那是取-Dkey=value的 JVM 系统属性,和args无关
基础用法示例(无第三方库)
如果只是简单判断或提取几个固定位置参数,可这样写:
if (args.length-
String inputFile = args[0];、String outputFile = args[1]; - 对数值类参数要自己
Integer.parseInt()并捕获NumberFormatException - 业务上依赖必填参数(如配置文件路径),应在解析后显式校验,而不是仅靠
args.length分支
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











