Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';这不会引发异常吗?_Java_String - Fatal编程技术网

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”的结果


注意-我永远不会这样做-我只是想满足好奇心。

它不应该抛出异常,因为:

  • beginIndex不是负值
  • endIndex不大于字符串的长度
  • beginIndex不大于endIndex
  • 说明

    "b" has a length of 1, a begin index of 0.
    
    "b".substring(1,1);
    
  • beginIndex为“1”,且不是负值
  • endIndex“1”不大于字符串“1”的长度
  • beginIndex“1”不大于endIndex“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”开始,但什么也得不到,否则“”字符串是什么意思?