黑马程序员技术交流社区

标题: 帮忙看一下关于角标越界的问题 [打印本页]

作者: Fightingforever    时间: 2014-10-27 12:02
标题: 帮忙看一下关于角标越界的问题
  1. public static void method_split()
  2.         {
  3.                 String s="abcdefgh";
  4.                 String s1=s.substring(1,15);//角标越界
  5.                 char s2=s.charAt(15);//角标越界
  6.                 int b=s.indexOf('a',15);//-1
  7.                 sop(s1);
  8.                 sop(s2);
  9.                 sop(b);
  10.                 }
  11. 同样都是超过字符串的长度,为什么indexOf()不会报角标越界,而substring()和charAt()会报角标越界
复制代码



作者: void    时间: 2014-10-27 13:14
不知道,感觉这个没有为什么吧,人家就那么实现的
作者: cvnmklop    时间: 2014-10-27 13:16
有些是规则没有为什么的。因为内部定的机制就是这样
作者: wzg1015    时间: 2014-10-27 13:33
这种问题很简单,通过选中函数,按f3就可以查看底层实现
先说indexof底层实现中有一个判断,其中fromIndex就是你说写的角标
  if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
        }
subString 的底层实现也有一个判断,但他是抛出异常
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
charAt同样是抛出异常
   public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

作者: chen578157939    时间: 2014-10-27 13:40
indexof是在字符串中去查找要匹配字符串,不存在越界的问题
作者: renchiyao    时间: 2014-10-27 16:10
查找帮助文件,String中的indexof(int)方法的返回
返回:
在此对象表示的字符序列中第一次出现该字符的索引;如果未出现该字符,则返回 -1。

作者: renchiyao    时间: 2014-10-27 16:12
indexof(int ch),这里的ch应该是字符的阿斯科马值
作者: Fightingforever    时间: 2014-10-27 17:50
wzg1015 发表于 2014-10-27 13:33
这种问题很简单,通过选中函数,按f3就可以查看底层实现
先说indexof底层实现中有一个判断,其中fromIndex ...

真的很感激 谢谢你!
作者: gaoyang    时间: 2014-10-27 18:15
我也学到了
作者: wzg1015    时间: 2014-10-27 19:04
Fightingforever 发表于 2014-10-27 17:50
真的很感激 谢谢你!

不客气,其实,上面的是一种想法 。
还有一种想法就是从客户的角度考虑,如果给定角标去截取或者获取,由于返回的是字符串或者字符,一种可行的方法是返回null告诉客户异常,但是对于这种有返回值的一般不建议返回null,因为需要客户去判断,而客户有时候会忘记判断,会导致问题被隐藏,所以唯一告诉客户错误的方法就是抛出异常。
而查找,他的返回值-1是可以代表没找到,所以可以把角标越界的问题给包含进去,所以不抛出。
作者: 坚持525    时间: 2014-10-27 20:02
多看看API文档吧,那里可以知道的
作者: Fightingforever    时间: 2014-10-27 22:46
坚持525 发表于 2014-10-27 20:02
多看看API文档吧,那里可以知道的

好的 谢谢指导 以后一定多看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2