Java 为什么';这不会引发异常吗?
我有以下的表达:Java 为什么';这不会引发异常吗?,java,string,Java,String,我有以下的表达: String y = new String("a") + "b".substring(1,1) + "c".concat("d").toUpperCase(); 代码编译并成功打印“aCD”。我的问题是,为什么 根据JLS,在计算表达式之前,应该从左到右计算操作数。这意味着“b”。子字符串(1,1)应该抛出IndexOutOfBoundsException。相反,它似乎只是抛开了价值 Java做了什么导致了“aCD”的结果 注意-我永远不会这样做-我只是想满足好奇心。它不
String y = new String("a") + "b".substring(1,1) + "c".concat("d").toUpperCase();
代码编译并成功打印“aCD”。我的问题是,为什么
根据JLS,在计算表达式之前,应该从左到右计算操作数。这意味着“b”。子字符串(1,1)应该抛出IndexOutOfBoundsException。相反,它似乎只是抛开了价值
Java做了什么导致了“aCD”的结果
注意-我永远不会这样做-我只是想满足好奇心。它不应该抛出异常,因为:
"b" has a length of 1, a begin index of 0.
"b".substring(1,1);
我完全同意这段代码是愚蠢的,因为它保证返回字符串“”;但是,在许多情况下,这些索引都是计算出来的,在某些情况下,允许返回空字符串而不是异常是很有意义的。您为什么认为
“b”。子字符串(1,1)
应该抛出IndexOutOfBoundsException
?“如果beginIndex为负数,或者endIndex大于此字符串对象的长度,或者beginIndex大于endIndex。”-这些都不是真的。长度==1。beginIndex==1,endIndex==1。违反了哪条规则?尝试隔离“b”。子字符串(1,1)要查看输出,可能您误解了子字符串与.NET的verison,其中第二个参数是长度?在java中,它是结束索引。这应该是显而易见的-我无法通过树看到森林。但它会抛出异常,这有点道理,因为第二个索引是排他的,人们可能会这样认为“我可以认为是包含的,但是将索引的值减少1“,因此它的意思是“从索引1开始,到索引0结束。“.但我猜是0.999。。。和1.00。。。毕竟是同一个数字,所以在这一点上它们是重叠的。@kjl一点问题都没有。我很容易看出一个人可能会被抛弃。Java的结束索引不包含结束字符,因此不必执行字符串处理中通常遵循的“从所有内容中减去1”逻辑,但这确实会导致一些误解。它允许“startIndex”有效地出现在字符串的“末尾”是另一个奇怪之处,但它同样有助于避免在解析东西时出现大量样板代码。@Gendarme您不能以低于Java中开始时的索引结尾。某些语言允许使用反转的子字符串执行此操作;但幸运的是,我没有一个用得太多。如果我可以以“1”结尾,我应该可以从“1”开始,但什么也得不到,否则“”字符串是什么意思?