将特殊字符计算为字符串时的StringIndexOutOfBoundsException

时间:2015-07-22 07:00:26

标签: java string indexoutofboundsexception

我正在编写一个代码,用于计算键盘中字符串提示符中的特殊字符。这是方法。

public static int specislChar(String s){
    int counter = 0;
    char ch;
    for (int i =0 ; i<=s.length(); i++){
        ch = s.charAt(i);
        if (!Character.isLetterOrDigit(ch) || ch != ' ') {
            System.out.print(" " + ch);
            counter++;
        }           
    }

    return counter;
} 

每次我调用此方法时,System.out.print()都会给我一个错误:

  

线程中的异常&#34; main&#34; java.lang.StringIndexOutOfBoundsException:
  字符串索引超出范围:20

7 个答案:

答案 0 :(得分:1)

你的循环应该小于i<s.length()。它是StringIndexOutOfBoundsException的原因,您必须使用AND运算符而不是OR

for (int i = 0; i < s.length(); i++) {
    ch = s.charAt(i);
    if (!Character.isLetterOrDigit(ch) && !Character.isSpaceChar(ch)) {
        System.out.print(" " + ch);
        counter++;
    }
}

答案 1 :(得分:0)

在调试此类问题时,请始终逐步运行代码并检查您所编写的内容是否正在执行您在每个步骤中所期望的内容,这是一种简单但非常宝贵的技术:)

如果您想计算不是字母/数字/空格的字符,请执行以下操作:

if ( !(Character.isLetterOrDigit(ch) || (ch==' ')) ){
对于每个不是空格的角色,

总是给出真实,你需要检查的是这个:

if ( (!Character.isLetterOrDigit(ch)) &&  (ch!=' ') ){

或者,应用De Morgan's Law

{{1}}

答案 2 :(得分:0)

for循环条件从<=更改为<以解决StringIndexOutOfBoundsException,因为数组索引从0开始,因此它将达到长度-1。

i < s.length();

&&条件中使用||(和)运算符而不是if(或)运算符,因为您要检查两个条件。

if (!Character.isLetterOrDigit(ch) && !Character.isSpaceChar(ch) )

答案 3 :(得分:0)

您收到的错误是由于此行:for (int i =0 ; i<=s.length(); i++){。在Java中,数组基于0并从0运行到n-1,其中n是您拥有的条目数。

因此,将其更改为for (int i =0 ; i<s.length(); i++){将删除错误。

此外,对于任何非特殊字符,|| ch != ' '也是如此,这将导致不准确的结果。我想你的意思是&& ch != ' '

答案 4 :(得分:0)

示例代码:

public class ____QuickTester {

    public static void main(String[] args) {

        // This should be 11
        System.out.println("Number of special characters: " + 
                specialChar("asdaskd12312!@(#(!@#)(*asdas12301230"));

        // This should be 8
        System.out.println("Number of special characters: " + 
                specialChar("!a@b#c$d%e aaa bbb ccc !!!"));
    }

    public static int specialChar(String s) {

        // Get rid of alphabets, digits and space
        s = s.replaceAll("[A-Za-z0-9 ]", "");
        return s.length();
    } 
}

<强>输出:

Number of special characters: 11
Number of special characters: 8
  • 更简单的方法是删除所有字母,数字和空格
  • 其余内容将是特殊字符

答案 5 :(得分:0)

做这样的事情: -

DECLARE @p1 DATE = '2004-10-18 07:53:31'
DECLARE @p2 DATE = '2004-10-18 10:13:35'
SELECT DATEDIFF(mi,@p1,@p2)

输入: - public static int specislChar(String s) { int counter = 0; for (char ch : s.toCharArray()) if (!Character.isLetterOrDigit(ch) && ch != ' ') counter++; return counter; }

输出: - %@%^&*(hi hello$!!+ #

答案 6 :(得分:0)

你正在循环i<=s.length();但它应该是i<=s.length()-1;因为索引从0开始。如果它从0开始那么它应该只是长度为1