在Java里如何接收命令行参数_Java参数传递说明
发布时间 - 2026-01-30 00:00:00 点击率:次main方法的String[] args参数接收Java命令行中类名之后的所有字符串(按空格/制表符分割,引号内内容不拆分),不包含java命令和类名;args数组永不为null,长度可为0。
main方法的String[] args参数到底接收什么
Java程序启动时,JVM会把命令行中java命令之后、类名之后的所有字符串,按空格(或制表符)分割后,作为字符串数组传给main(String[] args)。注意:引号包裹的内容(如"hello world")算作一个元素,不会被空格切开;但单引号无效,Windows下反斜杠需转义。
常见误解是认为args包含java命令本身或类名——其实不包含,只从第一个非命令/类名的token开始。
- 执行
java MyApp -v --port 8080 "log dir"→args是["-v", "--port", "8080", "log dir"] - 执行
java MyApp a\ b(Linux/macOS)→args[0]是"a b";Windows下a^ b才等效,直接写a\ b会被当成两个参数 - 若参数含等号(如
--name=alice),它就是一个完整字符串,不会自动拆成键值对
如何安全解析带选项的命令行参数
手写for循环遍历args容易出错:漏掉下一个参数、混淆位置与命名参数、忽略重复选项。建议用成熟库,而非自己切分或正则匹配。
Apache Commons CLI和picocli是主流选择。其中picocli更现代,支持注解、自动帮助生成、甚至子命令,且零依赖(单jar可运行)。
- 用
picocli时,定义字段加@Option注解,例如@Option(names = {"-p", "--port"}) int port = 8080; - 调用
new CommandLine(new MyApp()).parseArgs(args)后,字段自动赋值,非法参数会抛ParameterException并打印友好提示 - 避免用
System.getProperty()试图读取命令行参数——那是读JVM系统属性(-Dkey=value),不是args
args为空或null时会发生什么
args永远不会是null——JVM保证传入一个长度可能为0的数组。所以无需判空,但要检查长度。
- 执行
java MyApp→args.length == 0,不是null - 错误写法:
if (args == null) { ... }永远不执行,纯属冗余 - 正确判断无参:
if (args.length == 0);判断至少一个参数:if (args.length - 若逻辑依赖某个必填参数(如输入文件路径),应在解析后校验,而不是依赖数组长度做业务分支
在IDE里怎么模拟命令行参数调试
IDE运行配置中设置的“Program arguments”内容,会原样传给args,但要注意IDE对空格和引号的处理逻辑可能和终端不一致。
- IntelliJ:Run → Edit Configurations → Program arguments → 填
-c config.json --debug(不用加java MyApp前缀) - Eclipse:Run Configurations → Arguments → Program arguments → 同样只填参数部分
- 陷阱:在IDE里写
"a b",有些版本会去掉引号再传入,导致变成两个参数;稳妥做法是改用a\ b或在代码里用Arrays.toString(args)打印验证 - 真正上线前,务必在终端中手动执行一遍,避免IDE“帮你省事”掩盖问题
--verbose和--quiet不能共存)、以及错误时给出精准反馈。这些靠裸写args循环很难维护,交给picocli这类库处理更可靠。
# linux
# java
# js
# json
# windows
# apache
# app
# 端口
# mac
# ai
# eclipse
# jvm
# String
# NULL
# if
# for
# Token
# 字符串
# 命令行参数
# int
# 循环
# Length
# ide
# macos
# 命令行
# 但要
# 不包含
# 的是
# 是一个
# 切分
# 第一个
# 那是
# 很难
# 遍历
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel如何处理CORS跨域请求?(配置示例)
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel如何创建自定义Artisan命令?(代码示例)
详解Android中Activity的四大启动模式实验简述
EditPlus中的正则表达式实战(6)
如何在Tomcat中配置并部署网站项目?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
图册素材网站设计制作软件,图册的导出方式有几种?
如何在阿里云服务器自主搭建网站?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
如何在IIS中新建站点并解决端口绑定冲突?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
中山网站制作网页,中山新生登记系统登记流程?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
如何在腾讯云服务器快速搭建个人网站?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
JS经典正则表达式笔试题汇总
如何快速完成中国万网建站详细流程?
手机网站制作与建设方案,手机网站如何建设?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何在 Pandas 中基于一列条件计算另一列的分组均值
香港服务器租用费用高吗?如何避免常见误区?
Python文件流缓冲机制_IO性能解析【教程】
Laravel如何处理异常和错误?(Handler示例)
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
怎样使用JSON进行数据交换_它有什么限制
Laravel如何实现多对多模型关联?(Eloquent教程)
如何确保FTP站点访问权限与数据传输安全?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
jQuery中的100个技巧汇总
微信公众帐号开发教程之图文消息全攻略
Laravel如何使用Vite进行前端资源打包?(配置示例)
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
Windows Hello人脸识别突然无法使用
如何在建站之星网店版论坛获取技术支持?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
javascript中闭包概念与用法深入理解
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何快速选择适合个人网站的云服务器配置?


