Mac终端运行Java代码传入含$参数时触发数组越界异常求助
解决Mac终端运行Java程序时特殊符号(如$、*)无法正常传递的问题
我懂你碰到的这个坑——这根本不是Java不支持$符号的问题,而是Mac终端的shell(比如bash或zsh)会抢先解析这些特殊符号,导致它们没被正确传递给Java程序的命令行参数。
先拆解下你遇到的异常原因
当你执行java BirdDisplay sparrow $someBird时,shell会把$someBird当成一个环境变量来处理。如果这个变量之前没被定义过,shell就会把它替换成空字符串,这时候实际传给Java的参数就只有sparrow这一个。你的代码要取args[1],数组里只有一个元素,自然就抛出ArrayIndexOutOfBoundsException了。
下面是两种靠谱的解决办法
方法1:用单引号包裹特殊参数
单引号是shell里的“原样输出”开关,它会让shell完全不解析里面的内容,直接把字符串原封不动传给Java。比如:
java BirdDisplay sparrow '$someBird'
这样$someBird就会完整作为第二个参数传递给Java,args[1]就能拿到你想要的字符串了。
方法2:用反斜杠转义单个特殊符号
如果只是个别特殊符号需要保留,也可以用\来转义,告诉shell“这个符号是普通字符,别解析它”:
java BirdDisplay sparrow \$someBird
这样shell就会把$当作普通文本处理,传递给Java的就是$someBird。
额外说下*这类通配符的处理
如果你要传递*这种通配符,同样会被shell解析成当前目录下的所有文件名,所以也要用单引号包裹或者转义:
# 正确传递*作为参数 java BirdDisplay sparrow '*' # 或者 java BirdDisplay sparrow \*
可以自己验证下效果
修改你的测试代码,打印所有参数看看:
public class BirdDisplay{ public static void main(String... args){ System.out.println("参数总数:" + args.length); for(int i=0; i<args.length; i++){ System.out.println("args[" + i + "] = " + args[i]); } } }
重新编译后用单引号的方式运行,就能看到$someBird被正确传递为第二个参数啦。
内容的提问来源于stack exchange,提问作者Clatty Cake
相关产品推荐
相关产品推荐

