A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-唐磊 中级黑马   /  2012-12-20 18:33  /  1780 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class demo2 {
        public static void main(String[] args) {
                char[] num={'黑', '马', '程', '序', '员' };
                String s1="01234";
                String s2=num[s1.charAt(2)-'0']+"";//在这里为什么要减去0,如果不写-0为什么出现数组角标越界异常
                System.out.println(s2);
        }
}

评分

参与人数 1黑马币 +1 收起 理由
杨志 + 1 哥们!多看基础啊!

查看全部评分

8 个回复

正序浏览
filter 中级黑马 2012-12-21 09:49:08
9#
public class demo2 {
        public static void main(String[] args) {
                char[] num={'黑', '马', '程', '序', '员' };
                String s1="01234";
                String s2=num[s1.charAt(2)-'0']+"";//在这里为什么要减去0,如果不写-0为什么出现数组角标越界异常
                System.out.println(s2);
        }
}
s1.charAt(2)这个是字符串s1的一个方法,返回的是索引2位置的字符,也就是字符'2'
num是个字符数组,num[]里面中括号里面只能是数字,而字符'2'是字符类型,他的ASC码值是50,但是num长度只有5,当然会报字符数组长度越界
字符'0'的ASC码值是48,用'2'-'0'得到整数2,就得到num索引2处的字符--'程',后面(+ '''')是让结果变成字符串,不然会和s2的类型不匹配
回复 使用道具 举报
String s2=num[s1.charAt(2)-'0']+"";
这段代码不知你知道意思不?s1.charAt(2)的到的是'2',这是一个字符2,而不是一个数字,
之所以减‘0’,是因为在ACSII中字符0对应的是 48,也是就是说字符数字装换成对应的int数字,那么我们需要减
48,所以才会这样,其实楼主你将 ‘0’改成48,结果也是一样。

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
臧盼 中级黑马 2012-12-20 20:30:14
7#
public class demo2 {
        public static void main(String[] args) {
                char[] num={'黑', '马', '程', '序', '员' };
                String s1="01234";
                String s2=num[s1.charAt(2)-'0']+"";//在这里为什么要减去0,如果不写-0为什么出现数组角标越界异常
                System.out.println(s2);
        }
}
s1.charAt(2);是取得s1中的'2'这个字符,而num数组长度为5,'2'转换成整形远远大于5,所以发生数组角标越界,而'2'-'0'=2,所以不会发生角标越界。
回复 使用道具 举报
因为charAt方法返回指定索引处的 char 值,即字符型的数值,而角标需要的是int类型的值,所以会进行转换,把char类型的2,转为int类型的数据是其ASCII码值50,要想得到正确的角标,就要把char类型转换int类型时多出的数值减去,‘o'对应的是48,所以减去’o'。这是C语言里面经常用到的转换动作。
回复 使用道具 举报
charAt()方法返回的是指定索引出的char值 s1.charAt(2)得到的char值为字符'2' 如果不减去字符'0' 就相当于查找num[50] 所以角标越界 减去字符'0' 查找的就是mum[2] 得到'程'这个字符 和""相连接后类型提升 得到字符串"程"
回复 使用道具 举报
java中字符相减会默认转化为整形,如a-2相当于97-2;如果不对s1.charAt(2)进行减‘0’运算得到的是字符2的asc的码值为50,num[50]数组越界;s1.charAt(2)-'0'相当于整形运算50-48=2,num[2]没有越界
回复 使用道具 举报
你好,你现在的数组是字节。数组都是有下标的啊,而且也有长度。-‘0’就相当于长度-1了
回复 使用道具 举报
你好,你现在的数组是字节。数组都是有下标的啊,而且也有长度。-‘0’就相当于长度-1了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马