2012-05-30 3 views
0

Новый код:Java: индекс строки из диапазона: -1

Я понятия не имею, что здесь происходит, я получаю эту ошибку:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
    at java.lang.String.substring(String.java:1949) 
    at client0_0_2.loginToClient(client0_0_2.java:98) 
    at client0_0_2.general(client0_0_2.java:196) 
    at client0_0_2.<init>(client0_0_2.java:208) 
    at client0_0_2.main(client0_0_2.java:215) 

и это содержимое из метод, который вызывает ошибку:

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); 
     int startUsnm = logindat.indexOf(usnm); 
     String logdat = logindat.substring(startUsnm, logindat.indexOf(".")); 
     if (startUsnm == -1) { 
      System.err.println("Username not recognised, please try another or create user."); 
      usnm = "INV"; 
      return usnm; 
     } 
     else { 
      int tendUsnm = logdat.indexOf(':'); 
      int startPass = endUsnm + 1; 
      int tendPass = logdat.indexOf('.'); 
      String Usnm = logdat.substring("0", tendUsnm); 
      String Pass = logdat.substring(startPass, endPass); 
      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; 
} 

это выглядит вроде как он пытается получить доступ к последним символом чего-то, и это расстраивает, но я понятия не имею, почему. Любая помощь для новичков?

редактирует:

users.fra содержит username:password во время исполнения.

примечание: строка 98 представляет собой

char [] Passwd = Pass.toCharArray(); 

N.B. не домашнее задание, личный проект.

Будет добавлен метод обработки события, в котором имя пользователя не указано в users.fra.

+4

Где линия 98. – jn1kk

+0

Просьба привести пример, который вызывает такое поведение – amit

+0

Это домашнее задание? – bvulaj

ответ

3

indexOf() возвращает -1, когда аргумент не найден. Я уверен, что строка, которую вы ищете, не имеет одного из символов, которые вы ищете, и вызывает недопустимый индекс при попытке получить подстроку.

+0

Спасибо! Это не должно быть ... это поиск имени пользователя и пароля в файле, содержащем только «имя пользователя: пароль.», Поэтому я полагаю, что я испортил один из поисков ... – gossfunkel

0

Многие вещи могут быть неправильными. Вам нужно будет проверить, что напечатано.

Exemple:

int startUsnm = logindat.indexOf(usnm); 
String logdat = logindat.substring(startUsnm, logindat.indexOf(".")); 

Если у вас нет "Имя пользователя:" в logindat, он производит исключение вы видите.

EDIT: Обратите внимание, что если вы хотите, чтобы "имя пользователя:" (а не только "Имя пользователя:"), вы можете сделать это:

int startUsnm = logindat.toLowerCase().indexOf("username:"); 

И тест, который startUsnm является> = 0.

+0

Приведет заявление для реакции к этому разумно, ура! – gossfunkel

+0

«username:» отличается от «Username:» ... (см. Мое редактирование) –

3

попробуйте использовать до indexOf() для строки yor, чтобы избежать ситуаций, когда indexOf() возвращает -1, и вы пытаетесь получить подстроку с позицией -1.

+0

Как именно следует использовать 'contains()'? – gossfunkel

+0

например: 'если (myString.contains (SomeChar) && myString.contains (someOhterChar)) { Строка подстрока = myString.substring (myString.indexOf (SomeChar), myString.indexOf (someOhterChar))' –

1

String().indexOf вернет -1, если совпадений не найдено

String().substring выбросит StringIndexOutOfBoundsException если вы даете ему отрицательное begin значение.

Это все документировано в http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

Таким образом, я хотел бы посмотреть на эту строку кода:

String logdat = logindat.substring(startUsnm, logindat.indexOf(".")); 

Это не сработает, если usnm не в logindat

+0

Добавит в заявлении иметь дело с этим; благодаря! – gossfunkel

0

Вы должны действительно смотреть на этих линиях:

 int startUsnm = logindat.indexOf(usnm); 
     int tendUsnm = logdat.indexOf(':'); 
     int endUsnm = startUsnm + tendUsnm; 
     int startPass = endUsnm + 1; 
     int tendPass = logdat.indexOf('.'); 
     int endPass = startPass + tendPass; 
     String Usnm = logindat.substring(startUsnm, endUsnm); 
     String Pass = logindat.substring(startPass, endPass); 

Предположим, у вас есть файл:


пользователь: pass.


так:

  • startUsnm = 0 // первый символ
  • tendUsnm = 4 // индекс : полукокса
  • endUsnm = 4 // сумма? это, вероятно, не то, что вы намерены делать
  • startPass = 5 // p символ
  • tendPass = 9 // . полукокса
  • endPass = 14 // Сумма снова? Эти числа являются индексами - выбросят IndexOutOfBounds

А также учесть, что indexOf возвратит -1 значения, если нет такого матча в данных String.

+0

суммированные целые числа, если требуемое имя пользователя не является первым в файле users.fra; id est, он может содержать «имя пользователя: пароль.usrn: pass». и я только ищу usrn, а не имя пользователя. Это должно дать мне позицию конца имени пользователя относительно всей строки. Я только что понял, это бессмысленное упражнение, так как у меня есть строка, которая является только индексом usrn до «.» ... Теперь изменится. – gossfunkel

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