我正在尝试从控制台中获取一定长度的字符串,并将字符串中的空字符设置为星号。
System.out.println("Enter a string of digits.");
someString = input.next();
if(someString.matches("\\d{0,9}")) {
charArr = someString.toCharArray();
for ( char digit: charArr) {
if(!Character.isDefined(charArr[digit])){
charArr[digit] = '*';
}
}
System.out.printf("Your string is: %s%n", new String(charArr));
此代码抛出数组索引超出范围异常,我不知道为什么。
答案 0 :(得分:1)
for ( char digit: charArr)
会迭代charArr
中的每个字符
因此,digit
包含来自charArr
的字符值。
当您通过撰写charArr
来访问charArr[digit]
中的元素时,您正在将digit
从数据类型char
转换为int
值。 / p>
例如,您有charArr = new char[]{'a','b','c'}
charArr['a']
相当于charArr[97]
,但charArr
的长度仅为3。
因此,charArr
无法访问其大小超出的元素并抛出ArrayIndexOutOfBoundsException
。
解决方案:循环遍历数组索引而不是元素。
for(int i = 0; i < charArr.length; i++) {
// access using charArr[i] instead of charArr[digit]
...
}
答案 1 :(得分:0)
此循环语句:
for (char digit: charArr) {
迭代数组中的值。值的类型为char
,可以是0到65535之间的任何值。但是,此语句
if (!Character.isDefined(charArr[digit])) {
使用digit
作为数组的索引。对于&#34;工作&#34; (即不抛出异常),该值必须在0
到charArr.length - 1
的范围内。显然,对于您正在使用的输入字符串,其中一些值不能作为索引接受(例如value >= charArr.length
),然后会发生异常。
但是你不想通过测试value
来解决这个问题。无论如何,value
的值不是(从语义角度来看)数组索引。 (如果你使用它们就好像它们是索引一样,你最终会错过数组中的某些位置。)
如果要索引数组中的值,请执行以下操作:
for (int i = 0; i < charArr.length; i++) {
然后使用i
作为索引。
即使您已修复此问题,您的代码仍然存在问题......对于某些用例。
如果您的输入使用UTF-8编码(例如),它可能包含大于65535的Unicode代码点(字符),并在Java字符串中编码为两个连续的char
值。 (所谓的代理对。)如果您的字符串包含代理项对,则isDefined(char)
不是有效的测试。相反,您应该使用isDefined(int)
和(更重要的是)迭代字符串中的Unicode代码点,而不是char
值。
答案 2 :(得分:0)
我认为您正在混合for
块。在您的示例中,您将遍历someString.toCharArray()
中的每个字符,因此您无法!Character.isDefined(charArr[digit])
因为数字是字符,而不是字符。您不能使用char来获取数组的索引。
如果你纯粹检查一个角色是否是一个空格,你可以简单地做以下之一:
if (digit != ' ')
if (!Character.isWhiteSpace(digit)
if (Character.isDigit(digit))
答案 3 :(得分:0)
认为你可以用:
在一行中完成newString = someString.replaceAll("\\s", "*");
&#34; \ S&#34;是空格字符的正则表达式模式。