2015-07-22 6 views
-2

Я писал код, который учитывает специальные символы в строке запроса с клавиатуры. Это метод.StringIndexOutOfBoundsException при подсчете специальных символов строка

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() он дает мне ошибку:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 20

+0

Кол-во? – thanga

ответ

0

При отладке такого рода проблем, всегда запускать вам шаг кода за шагом, и проверить, что вы написали делает то, что вы ожидаете на каждом шагу, это простой, но бесценным техника :)

Если вы хотите посчитать символы, которые не буква/цифра/пространство, это:

|| ch != ' ' 

всегда будет давать верно для каждого символа, не пространство, чек, что вам нужно, чтобы это одна:

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

Или, применяя De Morgan's Law:

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

Я благодарю вас за вашу помощь, в которой это помогло. @ uraimo @ npinti @ Exbury @ Nama Gala –

0

Изменить свое состояние for петли от <= до <, чтобы решить StringIndexOutOfBoundsException как начало индекса массива от 0, так что оно будет идти до длины-1.

i < s.length(); 

И использовать && (а) оператор вместо || (или) оператора в if состоянии, как вы хотите, чтобы проверить оба условия.

if (!Character.isLetterOrDigit(ch) && !Character.isSpaceChar(ch)) 
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 != ' '.

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++; 
    } 
} 
0

Пример кода:

public class ____QuickTester { 

    public static void main(String[] args) { 

     // This should be 11 
     System.out.println("Number of special characters: " + 
       specialChar("[email protected](#([email protected]#)(*asdas123")); 

     // This should be 8 
     System.out.println("Number of special characters: " + 
       specialChar("[email protected]#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 
  • Намного проще вес ау было бы удалить все алфавиты, цифры и пробел
  • Оставшийся содержание будут специальные символы
+0

поблагодарить u @Gosu, но я сделаю другой. –

0

ли что-то вроде этого: -

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

Входной: - %@%^&*(hi hello$!!+ #

Выход: - 12

0

вы зацикливаете, хотя i<=s.length();, но это должно быть i<=s.length()-1;, потому что индекс начинается с 0. Если он начинается с 0, тогда он должен быть только длиной-1

Смежные вопросы