2015-09-11 2 views
-1

Следующий код используется для преобразования строки в длинное значение. Когда я вызвать функцию Это показывает ошибку как:Java String Exception

Исключение в потоке «основного» java.lang.StringIndexOutOfBoundsException: индекс строки из диапазона: -4 на java.lang.String.substring (String.java:1955) на Test.StringToInt64 (Test.java:13) на Test.main (Test.java:25)

код:

long StringToInt64(String s) 
{ 
    long ret_val = 0, k = 1; 

    for (int j = s.length(); j > 0; j--) 
    { 
     if(s.substring(j - 1,1) != ".") // Error Line 
     { 
      String t = s.substring(j-1,1); 

      ret_val = (ret_val + (Integer.parseInt(t)*k)); 
      k = k * 10; 
     } 
    } 

    return ret_val; 
} 

Ожидаемый ответ 11964.

Пожалуйста, помогите мне решить эту проблему ...

+0

Вместо 'substring()', вы должны использовать 'charAt (int index)', который возвращает символ, который можно сравнить с помощью '! =' (Строки нужно сравнивать с помощью 'equals()'). См. Http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt%28int%29 –

+0

Или даже проще: 'Long.parseLong (s.replaceFirst (" \\. "," "))' –

ответ

1

Ваш beginIndex больше, чем ENDINDEX и что вызывает excpetion.

Вы вызываете первую итерацию s.substring(5,1) где 5 ist beginIndex и 1 - endIndex.

Если что есть строка с длиной, который вы должны изменить свой код:

static long StringToInt64(String s) 
{ 
    long ret_val = 0, k = 1; 

    for (int j = s.length()-1; j > 0; j--) 
    { 
     if(!s.substring(j - 1,j).equals(".")) // Error Line 
     { 
      String t = s.substring(j-1,j); 

      ret_val = (ret_val + (Integer.parseInt(t)*k)); 
      k = k * 10; 
     } 
    } 

    return ret_val; 
} 

Вы можете видеть, что подстрока должна вызываться с параметром J-1 и J.

Также вам нужно сравнить строки с методом равных nit с !=.

Вместо substring вы можете также использовать chatAt()

1

Ваш код имеет много проблем:

1. substring(begin, end), не substring (begin, size)

2.При сравнить строки, используйте equals(), не ==

3.Почему вы звоните s.substring(j-1,j) 2 раза?

4.Если вы хотите, чтобы получить 1 символ из строки, используйте charAt()

5.Why вы звоните Integer.parseInt? Если вы можете вызвать эту функцию, почему бы не использовать Long.parseLong() вместо того, чтобы писать эту функцию StringToInt64().

6.With Java конвенции, она должна быть stringToInt64(), не StringToInt64() и retVal, не ret_val

7.следует использовать a += b вместо a = a + b

static long stringToInt64(String s) { 
    long retVal = 0, k = 1; 
    for (int j = s.length(); j > 0; j--) { 
     char t = s.charAt(j - 1); 
     if (t < '0' || t > '9') //ignore character not in '0' - '9' 
      continue; 
     retVal += ((t - '0') * k); 
     k *= 10; 
    } 
    return retVal; 
} 
1

Вот как я бы реализовать:

long stringToInt64(String s) { 
    long result = 0; 
    for (char c : s.toCharArray()) { 
     if (c != '.') { 
      result = result * 10 + Integer.parseInt(String.valueOf(c)); 
     } 
    } 
    return result; 
} 

И здесь еще лучше вариант (который ведет себя немного отличается для символов, которые не являются цифры)

long stringToInt64(String s) { 
    long result = 0; 
    for (char c : s.toCharArray()) { 
     if (c >= '0' && c <= '9') { 
      result = result * 10 + (c - '0'); 
     } 
    } 
    return result; 
} 

Что я изменил:

  • избежать использования строк длиной 1, с использованием char
  • использовать Еогеасп вместо для
  • изменить направление цикла (из-за Еогеасп)
  • не нужно больше для использования переменной k
  • Второй вариант: Избегайте использования parseInt для односимвольных строк. Это требует более строгой проверки ввода (в этом мы пропускаем все, что не является «0» .. '9')
  • Переименуйте функцию в соответствии с Java Naming Conventions. Личные предпочтения: вместо ret_val/retVal Я использовал имя переменной result.