Java字符串比较疑问:常量.equals(args[0])为何仍报错?
关于Java命令行参数equals比较的困惑解答
嘿,这个问题其实是把两种不同的异常搞混啦,书里的说法没错,只是你碰到了另一种需要处理的场景,咱们一步步理清楚:
先明确两种异常的核心区别
- 空指针异常(NullPointerException):书里提到的空值检查针对的是这种情况——如果
args数组有元素,但args[0]的值是null,那args[0].equals("Schrödinger")会因为调用null对象的方法触发NPE;而用常量字符串"Schrödinger".equals(args[0])时,因为常量永远不会是null,哪怕args[0]是null,equals()方法也会安全返回false,不会报错。 - 数组下标越界异常(ArrayIndexOutOfBoundsException):这是你现在遇到的问题——当运行程序时没有传任何命令行参数,
args数组的长度是0,根本不存在args[0]这个元素,不管你把它放在equals的哪一边,只要去读取这个不存在的下标,就会直接触发这个异常,这和null完全没关系。
正确的处理方案
要解决这个问题,你需要先判断args数组是否包含元素,再做equals比较,比如:
if (args.length > 0 && "Schrödinger".equals(args[0])) { System.out.println("Hallo"); }
这里利用Java的短路与特性:如果args.length > 0不成立,后面的equals比较就不会执行,既避免了下标越界,又保留了常量equals的空安全特性。
总结一下
书里的内容是针对「args[0]存在但可能为null」的场景,而你碰到的是「args[0]根本不存在」的情况,两者是完全不同的异常类型,所以书里的说法没问题,只是需要额外处理数组为空的情况~
内容的提问来源于stack exchange,提问作者Emiliyana Kalinova
相关产品推荐
相关产品推荐

