Исключение StringIndexOutOfBoundsException. Что необходимо исправить в коде?
Вылетает исключение StringIndexOutOfBoundsException. Jave учусь, и 12 часов не могу разобраться, как "обойти" это исключение.
Задание Прочитать текст Java-программы и в каждом слове длиннее двух символов все строчные символы заменить прописными.
Мой код
package OptionalTask.Task4;
import java.io.*;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class work {
public static void main(String[] args) {
try(FileWriter writer = new FileWriter("data/Task4.txt");
FileReader reader = new FileReader("data/SomeJavaCode.txt");
BufferedWriter bufferedWriter = new BufferedWriter(writer);
BufferedReader bufferedReader = new BufferedReader(reader)){
String line = null;
String word = null;
StringBuffer buffer = new StringBuffer();
Pattern pattern = Pattern.compile(".{2,}");
while ((line = bufferedReader.readLine()) != null) {
Scanner scan = new Scanner(line);
while (scan.hasNext()) {
word = scan.next();
Matcher matcher = pattern.matcher(word);
if (matcher.matches()) {
buffer.append(matcher.group().toUpperCase() + " ");
} else {
buffer.append(word + " ");
}
}
bufferedWriter.write(buffer.toString(), 0, line.length());
bufferedWriter.newLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
При компиляции "выскакивает"
java.lang.StringIndexOutOfBoundsException: String index out of range: 27
at java.lang.String.getChars(String.java:821)
at java.io.BufferedWriter.write(BufferedWriter.java:226)
at OptionalTask.Task4.work.main(work.java:31)
Желательно разжевать все 4 строчки исключения.
Как понял их я: java.lang.StringIndexOutOfBoundsException: String index out of range: 27 - Вышел за длину в 27 символов (27 символов находится в первой строчке java кода, которое приложение считывает по пути "data/SomeJavaCode.txt") at OptionalTask.Task4.work.main(work.java:31) - Ошибка находится в 31 строке кода. (bufferedWriter.write(buffer.toString(), 0, line.length());)
Ну и помимо исключений, хотелось бы получить ответ, как исправить свой код, что бы не болела голова.
В самой теме исключения, плаваю. Перекопав интернет, вычитал, что можно сделать доп. цикл, но прикрутить никуда не смог =)
Ответы (1 шт):
Ошибка указывает на строку 31.
На этой строке находится bufferedWriter.write(buffer.toString(), 0, line.length());
Могу предположить, что в объект BufferedWriter вы передаёте объект StringBuffer который хранит в себе строчки со всеми прописными буквами, А ТАК ЖЕ индексы от начала и конца строки. Индексация в программировании принято считать с НУЛЯ, а метод line.length() возвращает длину строки в НАТУРАЛЬНЫХ числах. Следовательно у вас перемежается понимание человека и понимание компьютера.
Получается, что line.length() возвращает вам длину строки, начиная с 1. Длина строки у вас 27 - это логично.
Но в памяти компьютера строка хранится как массив символов, а массивы индексируются с нуля. Следовательно последний 27ой элемент по человеческим меркам будет иметь индекс 26. То бишь вам нужно добавить line.length() - 1, чтобы удовлетворять условиям индексации.
По итогу должно получится как-то так :
bufferedWriter.write(buffer.toString(), 0, line.length() - 1);