2013-11-11 2 views
2

Может кто-нибудь объяснить, что происходит? Вот пример кода: Функция вызывается с параметром: «S26V5»java string.Substring StringIndexOutOfBoundsException внутри цикла

private String uniqueCode(String inp) 
{ 
    String index = "023456789ABCDEFGHJKLMNOPQRSTUVWXYZ"; 
    int basse = index.length(); 
    String outt = ""; 
    inp = new StringBuilder(inp).reverse().toString(); 
    double oout = 0; 
    int lenn = inp.length() - 1; 
    Log.d("nom", "String inp lenght:" + Integer.toString(lenn)); 
    for (int i = 0; i <= lenn; i++) 
    { 
     double pow = Math.pow(basse, lenn - 1); 
     Log.d("nom", "i=" + Integer.toString(i)); 
     Log.d("nom1",inp.substring(i, 1)); 
     Log.d("nom2", Integer.toString(index.lastIndexOf(inp.substring(i, 1)))); 
     oout += index.lastIndexOf(inp.substring(i, 1)) * pow; 
    } 
    outt = Double.toString(oout); //oout.ToString("F2"); 
    outt = outt.substring(0, outt.lastIndexOf('.')); 
    outt = outt.substring(3); 
    return outt; 
} 

Вот бревно из LogCat:

nom(2597): String inp lenght:4 <- Ok, string lenght 
nom(2597): i=0 <- first iteration 
nom1(2597): 5 <- inp.substring(i, 1) first time 
nom2(2597): 4 <- index.lastIndexOf(.... first time 
nom(2597): i=1 <- second iteration and 
nom2(2597): 34 <- next is index.lastIndexOf(.... 
nom(2597): i=2 
AndroidRuntime(2597): Shutting down VM 
W/dalvikvm(2597): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
E/AndroidRuntime(2597): FATAL EXCEPTION: main 
E/AndroidRuntime(2597): java.lang.StringIndexOutOfBoundsException: length=5; regionStart=2; regionLength=-1 
E/AndroidRuntime(2597):  at java.lang.String.startEndAndLength(String.java:593) 
E/AndroidRuntime(2597):  at java.lang.String.substring(String.java:1474) 
E/AndroidRuntime(2597):  at Bar.Man.BarManActivity.uniqueCode(BarManActivity.java:750) 

И вопрос: почему во второй итерации не печатается inp.substring(i, 1)? И я постоянно получаю StringIndexOutOfBoundsException. Что не так с моим кодом?

ответ

4

substring(int beginIndex, int endIndex) См:

IndexOutOfBoundsException -

если beginIndex отрицательный, или ENDINDEX больше, чем длина этой строки объекта, или beginIndex является больше ENDINDEX.

Вы ошибетесь в inp.substring(i, 1), когда i > 1.

+0

Я попытался преобразовать свой код на C#. Теперь я вижу разницу. В C# это: 'public string Substring (int startIndex, int length)'. Является ли эта функция в java? – Guntis

+0

@Guntis Это не то же самое, прочитайте документы снова. – Maroun

+1

Подстрока @Guntis в Java - это 'substring (int startIndex, int endIndex)' – Compass

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