为什么这不会引发异常?

时间:2016-08-22 21:21:21

标签: java string

我有以下表达式:

  String y = new String("a") + "b".substring(1,1) + "c".concat("d").toUpperCase();

代码编译,并成功打印" aCD"。我的问题是,为什么?

根据JLS,在评估表达式之前,应该从左到右评估操作数。这意味着" b" .substring(1,1)应抛出IndexOutOfBoundsException。相反,它似乎只是抛弃了价值。

Java正在做什么导致" aCD"?

的结果

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

1 个答案:

答案 0 :(得分:3)

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

  1. beginIndex不是否定的。
  2. endIndex不大于String的长度。
  3. beginIndex不大于endIndex。
  4. 说明

    "b" has a length of 1, a begin index of 0.
    
    "b".substring(1,1);
    
    1. beginIndex是" 1",并且不是否定的。
    2. endIndex" 1"不大于字符串" 1"。
    3. 的长度
    4. beginIndex" 1"不大于endIndex" 1"。
    5. 我完全同意这段代码很愚蠢,因为它保证了字符串的返回"&#34 ;;但是,在很多情况下会计算这些索引,在某些情况下,允许返回空字符串而不是异常是很有意义的。