2012-06-02 2 views
3

Странная проблема. Я запускаю эту (очень элементарную) процедуру, чтобы найти имя пользователя и пароль в файле, а программа должна сравнить введенный пароль с сохраненным паролем. Однако каждый раз я получаю странное исключение String index out of range: -1. Раньше у меня была аналогичная проблема, однако на этот раз звонок indexOf('.') возвращает -1; который ему не нравится. Почему indexOf() возвращает -1, если это вызывает ошибку? Вот источник:java: 'string index out the range: -1' exception using indexOf()

public String loginToClient() throws FileNotFoundException, IOException { 
     //decryptUsers(); 
     int tries; 
     tries = 5; 
     while (tries > 0) { 
      System.out.println("LOGIN"); 
      String usnm = c.readLine("Username: "); 
      char [] passwd = c.readPassword("Password: "); 
      users = new FileInputStream("users.fra"); 
      DataInputStream dis = new DataInputStream(users); 
      BufferedReader br = new BufferedReader(new InputStreamReader(dis)); 
      String logindat = br.readLine(); 
      System.out.println(logindat); 
      if (logindat.contains(usnm) == null) { 
       System.err.println("Username not recognised, please try another or create user."); 
       usnm = "INV"; 
       return usnm; 
      } 
      else { 
       int startUsnm = logindat.indexOf(usnm); 
       System.out.println("startUsnm: " + startUsnm); 
       String logdat = logindat.substring(startUsnm, logindat.indexOf(".")); 
       System.out.println("logdat: " + logdat); 
       int endUsnm = logdat.indexOf(':'); 
       System.out.println("endUsnm: " + endUsnm); 
       int usnmend = endUsnm - 1; 
       System.out.println("usnmend: " + usnmend); 
       int startPass = endUsnm + 1; 
       System.out.println("startPass: " + startPass); 
       int endPass = logdat.indexOf('.'); 
       System.out.println("endPass: " + endPass); 
       String Usnm = logdat.substring(0, usnmend); 
       System.out.println("Usnm: " + Usnm); 
       int passend = endPass - 1; 
       System.out.println("passend: " + passend); 
       String Pass = logdat.substring(startPass, passend); 
       System.out.println("Pass: " + Pass); 
       char [] Passwd = Pass.toCharArray(); 
       if (usnm.equals(Usnm)) { 
        if (Arrays.equals(passwd,Passwd)) { 
         System.out.println ("Logged in. Welcome, " + usnm + "."); 
         String data = "LOGIN: " + usnm; 
         printLog(data); 
         //encryptUsers(); 
         return usnm; 
        } 
        else { 
         System.out.println ("Incorrect password, please try again."); 
         String data = "PASWFAIL: " + usnm; 
         printLog(data); 
         tries -= 1; 
        } 
       } 
       else { 
        System.out.println ("Username not recognised."); 
        printLog("USNAMFAIL"); 
        usnm = "INV"; 
        return usnm; 
        //encrytUsers(); 
       } 
      } 
     } 
     //encryptUsers(); 
     System.exit(2); 
     return usnm; 
    } 

А вот некоторый ввод/вывод:

Startup initiated. 
Logfile exists. 
Users file exists. 
New user? n 
ELSE 
LOGIN 
Username: rik 
Password: 
rik:55. 
startUsnm: 0 
endUsnm: 3 
startPass: 4 
endPass: -1 
Usnm: rik 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5 
    at java.lang.String.substring(String.java:1949) 
    at client0_0_2.loginToClient(client0_0_2.java:103) 
    at client0_0_2.general(client0_0_2.java:209) 
    at client0_0_2.<init>(client0_0_2.java:221) 
    at client0_0_2.main(client0_0_2.java:228) 

EDIT: РЕШЕНИЕ НАЙДЕНО!

По какой-то причине indexOf() не хочет находить '.'- при замене дефиса (' - '), однако, он работает отлично, казалось бы!

+1

Помните: «первый» индекс равен 0. «-1» означает «не найден»? Как * else * вы хотите, чтобы «indexOf()» возвращал значение «not found»? Выброс исключения может быть законным выбором. Но разве вы не просто проверили бы «-1»? Что вы можете легко найти, посмотрев Javadocs на ["String"] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html) – paulsm4

+1

В той же проблеме, где точка определенно существует в строке, но как-то indexOf ('.') возвращает -1. – lrl

ответ

2

Я думаю, что ошибка в этой строке:

String Pass = logdat.substring(startPass, passend); 

По какой-то причине (вы должны будете определить, почему), Вы можете вычислить passend путем поиска . в строке. Если . нет, indexOf возвращает -1 как контролер. Однако это не строка, которая вызывает исключение. Я думаю, что это вышеприведенная строка, так как если вы попытаетесь вычислить подстроку, заканчивающуюся на passend, когда passend равно -1, вы получите вышеуказанную ошибку.

Попытайтесь определить, почему ваша строка не содержит ..

Надеюсь, это поможет!

+0

интересно, спасибо ... должно быть. ... * puzzled * – gossfunkel

+0

-второй раз я запустил это (с модификациями), он, кажется, удаляет персонаж с конца, которого он не был раньше ...- _disregard this_ – gossfunkel

+3

О, также - ** никогда хранить пароли в обычном тексте! ** Это кошмар безопасности, который ждет. – templatetypedef

1

Когда indexOf() возвращает -1, это означает, что значение не может быть найдено в строке. Итак, в этом случае вы ищете строку для '.', которая не существует в String.

Я рекомендую вам всегда проверить значения indexOf() после вызова, и обрабатывать -1 должным образом. Для многих случаев его, вероятно, достаточно, чтобы установить его либо 0, либо string.length(), в зависимости от того, как вы будете использовать его позже в своем коде.

Независимо от того, что вы ожидаете, что существует '.', и его нет, вам нужно будет отладить свой код, чтобы узнать, что это за значение, и где отсутствует '.'.

+0

кажется, что точка определенно присутствует, и когда искомая строка напечатана, она (сейчас) содержит ее. Кажется, что он возвращает -1: я буду использовать string.length(): D отличное предложение, спасибо. – gossfunkel

+0

Могу я просто спросить, почему вы делаете такие вещи ... 'int passend = endPass - 1;'? Когда вы вызываете 'indexOf (". ")', Он немедленно возвращает индекс позиции * до *. '. Я предполагаю, что вы делаете 'endPass-1', чтобы попытаться удалить точку из' substring() ', и в этом случае это не требуется, и это может привести к вашей ошибке. – wattostudios

+0

Я считаю, что это может быть одной из причин проблемы - даже если эта линия удалена, она не обнаружила точку; я изменил его на дефис, и он сработал. Спасибо, хотя это также вызвало бы ошибки! – gossfunkel

0

indexOf() возвращает -1, если указанная строка не найдена.

Проблема заключается в линии:

String Pass = logdat.substring(startPass, passend); 

из-за отрицательного индекса.

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