Как исправить "Исключение в потоке" main "java.lang.StringIndexOutOfBoundsException: Строковый индекс вне диапазона: 5" проблема в Java - PullRequest
0 голосов
/ 18 сентября 2019

Я пытаюсь создать код, который печатает «VALID ENTRY», если ввод начинается с «Today» и заканчивается «MLIA» (регистр не имеет значения).Если этого не произойдет, то будет напечатано «НЕПРАВИЛЬНОЕ ФОРМАТИРОВАНИЕ, ПОПРОБУЙТЕ ДРУГОЕ ПРЕДСТАВЛЕНИЕ».По какой-то причине программа продолжает выдавать мне ошибку, выходящую за границы, и я не могу понять, почему.

Когда я изменил код подстроки на sub.substring(0,1), чтобы проверить его, я все еще выдавал ошибку,так что это не проблема.Я также попытался добавить значение символа для каждой буквы, чтобы определить, что это за слово, но оно тоже не сработало.

public class submit{
   public static void main(String[] args) throws IOException{

   Scanner scanner = new Scanner(new File("submit.txt"));

   int trials = scanner.nextInt();
   int total = 0;

   for(int x = 0; x <= trials; x++){
       String sub = scanner.nextLine();
       sub = sub.toLowerCase();
       if(sub.substring(0,5) == "today") //I only have it set up to find "today"
         System.out.println("VALID ENTRY");
       else
         System.out.println("INCORRECT FORMATTING, TRY ANOTHER SUBMISSION");

      }  
   }//end of main
}//end of class

Ввод:

5  
ToDAY, I went to school. mlia  
Hehehe today mlia this shouldn't work  
Today, I went to a programming contest. Hehe. MLIA  
TODAYMLIA  
T0day is a brand new day! MLIA  

Ожидаемый вывод должен быть:

VALID ENTRY  
INCORRECT FORMATTING, TRY ANOTHER SUBMISSION  
VALID ENTRY  
VALID ENTRY  
INCORRECT FORMATTING, TRY ANOTHER SUBMISSION  

Фактический объем производства:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5  
    at java.lang.String.substring(String.java:1963)   
    at submit.main(submit.java:15)

Ответы [ 2 ]

0 голосов
/ 18 сентября 2019

Вместо этого вы можете использовать следующий код.

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Submit {
    public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(new File("submit.txt"));

        int trials = scanner.nextInt();
        scanner.nextLine();
        int total = 0;

        for (int x = 0; x < trials; x++) {

            String sub = scanner.nextLine();
            sub = sub.toLowerCase();
            System.out.print(sub + " -> ");
            if (sub.startsWith("today")) // I only have it set up to find "today"
                System.out.println("VALID ENTRY");
            else
                System.out.println("INCORRECT FORMATTING, TRY ANOTHER SUBMISSION");

        }
        scanner.close();
    }// end of main
}// end of class

Вы можете использовать StartWith и NextLine необходимо вызывать после nextInt, потому что nextInt не читает символ новой строки и сохраняет курсор на той же строке послеINT 5 читается.Таким образом, вы получаете ту ошибку, с которой сталкиваетесь.

Когда вы добавляете дополнительную nextLine(), она фактически переходит на следующую строку.

После этого у вас есть только 5 строк для чтения, и выне нужно <=, иначе он снова выдаст ошибку в конце.

Так что make is < only

И startsWith() хорошо, если вам нужно только проверить началои если вы тоже хотите проверить end, тогда есть метод endsWith(), а также

. Строка также нуждается в equals для сопоставления со строковыми литералами, если вы хотите использовать равенство.

0 голосов
/ 18 сентября 2019

Есть две проблемы с кодом.Во-первых, вы должны сравнить String с, используя equals, а не ==.В противном случае он может вернуть false даже для идентичных String с.

Во-вторых, nextLine будет считывать от Scanner до следующего символа новой строки.Но nextInt будет считывать только до этой новой строки, поэтому ваш первый вызов nextLine просто увеличивает Scanner на один символ и возвращает пустой String.Вам нужно вызвать дополнительный nextLine после nextInt, чтобы перейти на следующую строку после вашего целого числа.Для получения дополнительной информации см. этот вопрос .

Поэтому вы должны внести следующие изменения в свой код:

Scanner scanner = new Scanner(new File("submit.txt"));

int trials = scanner.nextInt();
scanner.nextLine(); //Add this line, to consume the newline character after "5"
// alternatively, you could replace both of the above lines with this:
// int trials = Integer.parseInt(scanner.nextLine());
int total = 0;

for(int x = 0; x <= trials; x++){
   String sub = scanner.nextLine();
   sub = sub.toLowerCase();
   if(sub.substring(0,5).equals("today")) //compare strings using equals, not ==
     System.out.println("VALID ENTRY");
   else
     System.out.println("INCORRECT FORMATTING, TRY ANOTHER SUBMISSION");

}
...