Из-за чего возникает переполнение?

119
09 сентября 2021, 20:40

Программа для нахождения слов с заданными окончаниями.

По отдельности методы работают, но если я пытаюсь из метода readAndSend() передать строку в foundIndex(String read), то выдает ошибку

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

С чем это связано?

  import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    public class JavaApplication31
    {
        public static void main(String[] args) throws java.lang.Exception
          {
            Reader r = new Reader();
            r.wordAppend();
            r.wordEnd();
            //          r.readAndSend();
            String readMe = "р ых. ых, ах sах gых укусила ах ыыыыыы ых ";
            r.foundIndex(readMe);
            System.out.println("");
          }
    }
    class Reader
    {
        String allText = "";
        void readAndSend() throws IOException
          {
            Reader rr = new Reader();
            String fragment = "";
            int sum = 0;
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("R.txt"), "Cp1251"));
                int ch;
                for (;;) {
                    ch = br.read();
                    if (ch == -1) {
                        break;
                    }
                    allText += String.valueOf((char) ch);
                    fragment += String.valueOf((char) ch);
                    sum++;
                    if (sum % 1000 == 0) {
                        rr.foundIndex("р ых. ых, ах sах gых укусила ах ыыыыыы ых ");
                        //           r.foundIndex(fragment);
                        //           System.out.println(fragment);
                        fragment = "";
                    }
                }
                br.close();
            }
            catch (Exception e) {
                System.out.println("tshtsht");
                e.printStackTrace();
            }
          }
        ArrayList<String> wordEnd = new ArrayList();
        void wordEnd()
          {
            wordEnd.add("ых");
            wordEnd.add("ах");
            wordEnd.add("ла");
            wordEnd.add("ся");
          }
        ArrayList<String> wordAppend = new ArrayList();
        void wordAppend()
          {
            wordAppend.add(" ");
            wordAppend.add(".");
            wordAppend.add(",");
          }
        void foundIndex(String read) throws IOException// получать строку
          {
            int addWordCount = 0;
            int countChangeEnd = 0;
            int goEnd = 0;
            int countArrayEnd = 0;
            String readMe = read;
            for (int indexEnd = 0;; indexEnd += 1) {
                indexEnd = readMe.indexOf(wordEnd.get(countArrayEnd) + wordAppend.get(countChangeEnd), indexEnd); // окончания + . или пробел 
                if (indexEnd == -1) {
                    if (countArrayEnd + 1 == wordEnd.size()) {
                        if (countChangeEnd + 1 == wordAppend.size()) {
                            break;
                        }
                        countArrayEnd = 0;
                        countChangeEnd++;
                        continue;
                    }
                    countArrayEnd++;
                    continue;
                }
                int indexStart = readMe.lastIndexOf(" ", indexEnd);
                System.out.println(indexStart + " // " + indexEnd);
                if (wordEnd.get(countArrayEnd).equals("ла") || wordEnd.get(countArrayEnd).equals("ли") || wordEnd.get(countArrayEnd).equals("ло")) {
                    System.out.println(readMe.substring(indexStart + 1, indexEnd + wordEnd.get(countArrayEnd).length() - 1));
                }
                else {
                    System.out.println(readMe.substring(indexStart + 1, indexEnd + wordEnd.get(countArrayEnd).length()));
                }
            }
          }
    }
Answer 1

С чистотой кода явные проблемы, но да ладно.

Проблема банальная, вы в основной программе вызываете функции заполнения массивов, а только потом уже вызываете свою функцию.

Reader reader = new Reader();
reader.wordAppend();
reader.wordEnd();

А в вашей функции вы этого не делаете и при попытке получить элемент из пустого списка закономерно получается ошибку ArrayList -> get -> IndexOutOfBoundsException.

ArrayList<String> wordAppend = new ArrayList();
wordAppend.get(0)

Думаю так должно работать

...
rr.wordAppend();
rr.wordEnd();
rr.foundIndex("р ых. ых, ах sах gых укусила ах ыыыыыы ых ");
...
READ ALSO
Jquery animate scrollTop не рабоатет

Jquery animate scrollTop не рабоатет

Любой другой код работаетЯ удалил все скрипты полностью, оставил только этот - не работает

184
Как достучаться до значение в массиве?

Как достучаться до значение в массиве?

Как можно заменить знаки вопроса? Достучаться до элементов если не знаешь имя

147
Как заполнить форму на другом сайте

Как заполнить форму на другом сайте

Всем приветМне нужно заполнить один input на другом сайте и нажать кнопку отправить, потом достать полученные данные

115
Как нарисовать ромб на JavaScript?

Как нарисовать ромб на JavaScript?

у меня не получается

164