JavaRush
Акция
Университет
Java FullStack
Python FullStack
AI Native Developer
new
Web FullStack
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/В чём может быть проблема?
Soros
39 уровень
  • 21.01.2020
  • 910просмотров
  • 10комментариев

В чём может быть проблема?

Вопрос по задаче Строки нитей или строковые нити? Вот в чем вопрос
Java Multithreading,  2 уровень,  5 лекция
Решен

1. Метод getPartOfString должен возвращать подстроку между первой и последней табуляцией.
2. На некорректные данные getPartOfString должен бросить исключение:
а) StringForFirstThreadTooShortException, если имя трэда FIRST_THREAD_NAME.
б) StringForSecondThreadTooShortException, если имя трэда SECOND_THREAD_NAME.
в) RuntimeException в других случаях.
3. Реализуй логику трех protected методов в OurUncaughtExceptionHandler используя вызовы соответствующих методов согласно следующим шаблонам:
a) 1# : StringForFirstThreadTooShortException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1
б) java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : StringForSecondThreadTooShortException : 2#
в) RuntimeException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : 3#

Требования:
  • Метод getPartOfString() должен возвращать подстроку между первой и последней табуляцией строки string переданной ему в качестве первого параметра.
  • В случае некорректных данных метод getPartOfString() должен бросить исключение StringForFirstThreadTooShortException, если имя трэда(threadName) Solution.FIRST_THREAD_NAME.
  • В случае некорректных данных метод getPartOfString() должен бросить исключение StringForSecondThreadTooShortException, если имя трэда(threadName) Solution.SECOND_THREAD_NAME.
  • В случае некорректных данных метод getPartOfString() должен бросить исключение RuntimeException, если имя трэда(threadName) не Solution.FIRST_THREAD_NAME или Solution.SECOND_THREAD_NAME.
  • Метод getFormattedStringForFirstThread() должен возвращать строку сформированную из переданных параметров по шаблону указанному в задании.
  • Метод getFormattedStringForSecondThread() должен возвращать строку сформированную из переданных параметров по шаблону указанному в задании.
  • Метод getFormattedStringForOtherThread() должен возвращать строку сформированную из переданных параметров по шаблону указанному в задании.
package com.javarush.task.task22.task2201; public class Task implements Runnable { private String initialString; private Solution solution; public Task(Solution solution, String initialString) { this.solution = solution; this.initialString = initialString; } @Override public void run() { String name = Thread.currentThread().getName(); String str = this.initialString; do { System.out.println(name + str); } while ((str = solution.getPartOfString(str, name)) != null || !str.isEmpty()); } }
0
Комментарии (10)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia VolkovaJava Developer в DXCMaster
21 января 2020, 09:26
а если вот это
String addString = e.getCause().getClass().getCanonicalName() + ": " + e.getCause().getMessage();
заменить на e.toString() ?
0
Soros
Уровень 39
21 января 2020, 10:02
Если в 20-й строке заменить
String addString = e.getCause().getClass().getCanonicalName() + ": " + e.getCause().getMessage();
на
e.toString()
То вывод для Other тоже не будет соответствовать шаблону из условия. Из условия должно быть:
RuntimeException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : 3#
c e.toString будет
RuntimeException : java.lang.RuntimeException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : 3#
Зачем? Ведь проблемы только с First и Second, с Other проблем нет.
0
Ksenia VolkovaJava Developer в DXCMaster
21 января 2020, 10:33
Да мне кажется, везде эти навороты лишние. Тебе уже дана строка для форматирования
final String string = "%s : %s : %s";
Надо в нее подставить подходящие значения. И ничего к ней не надо прибавлять. Что-то вроде:
return String.format(string,
        t.getName(),
        e.getClass().getSimpleName(),
        e.getCause().toString());
И всё.
0
Soros
Уровень 39
21 января 2020, 15:26
Наворотов там нет. Дополнительная строка из-за того, что, кроме необходимости учитывать пробелы по сторонам от двоеточий, строка для форматирования "%s : %s : %s" создана для 3-х переменных. В заданном шаблоне требуется вывести больше данных. Например для Second:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : StringForSecondThreadTooShortException : 2#
а) java.lang.StringIndexOutOfBoundsException - выводит конструкция e.getCause().getClass().getCanonicalName() б) String index out of range: -1 - выводит конструкция e.getCause().getMessage() в) StringForSecondThreadTooShortException - выводит конструкция e.getClass().getSimpleName() г) 2# - t.getName() Не пойму, почему не принимается решение.
0
Ksenia VolkovaJava Developer в DXCMaster
21 января 2020, 15:32
Шаблон не случайно задан на 3 элемента - потому что все эти строки можно разделить как раз на 3 части. "java.lang.StringIndexOutOfBoundsException: String index out of range: -1" - вполне может быть одной частью, а не двумя кусками - e.getCause.toString()
0
Soros
Уровень 39
21 января 2020, 15:57
Так-то оно так, но в этом варианте появляются лишние пробелы. Код
protected String getFormattedStringForSecondThread(Thread t, Throwable e, String string) {
//  java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : StringForSecondThreadTooShortException : 2#
        String result = String.format(string,
                e.getCause().toString(),
                e.getClass().getSimpleName(),
                t.getName());
        return result;
даёт результат:
java.lang.StringIndexOutOfBoundsException:  String index out of range: -1 : StringForSecondThreadTooShortException : 2#
а нужно
//  java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : StringForSecondThreadTooShortException : 2#
Появился лишний пробел между ...Exception: и String Поэтому изначально и был костыль в виде добавочной строки. Или твой вариант может быть без лишнего пробела?
0
Ksenia VolkovaJava Developer в DXCMaster
21 января 2020, 16:27
Ты так говоришь, как будто этот пробел с потолка взялся, а не ты сам своими руками его прописал в getCause(). Да и в принципе не очень-то правильно хардкодить getCause() вместо того, чтобы перехваченный эксепшн передать в конструктор твоих ...TooShortException
public StringForFirstThreadTooShortException(Exception e) {
    super(e);
}
Тогда и переопределять ничего уже не надо будет, getCause и так вернет то, что нужно. Поэтому-то у тебя Other проходит нормально, а First и Second - нет.
0
Soros
Уровень 39
21 января 2020, 16:44
Не совсем понимаю, где я этот пробел мог сам прописать?
0
Ksenia VolkovaJava Developer в DXCMaster
21 января 2020, 20:00
@Override
public synchronized Throwable getCause() {
    return new StringIndexOutOfBoundsException(" String index out of range: -1");
}
Вот этого в задаче не было, это ты сам написал. И в начале строки лишний пробел. Но даже если бы его не было - подход неверный.
0
Soros
Уровень 39
22 января 2020, 07:07
Точно. Не заметил этого пробела. Спасибо. Забыл о переопределении этого метода. Задача просто мутная. Код исправил, а проблема осталась. Создал новую тему.
0
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRushJavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2026 JavaRush
MastercardVisa
"Программистами не рождаются" © 2026 JavaRush