Что не нравится валидатору? выводит корректно.

package com.javarush.test.level22.lesson05.home01;

        /* Нитиевые строки или строковые нити? Вот в чем вопрос.
        1. Метод getPartOfString должен возвращать подстроку между первой и последней табуляцией.
        2. На некорректные данные getPartOfString должен бросить исключение:
        а) TooShortStringFirstThreadException, если имя трэда FIRST_THREAD_NAME.
        б) TooShortStringSecondThreadException, если имя трэда SECOND_THREAD_NAME.
        в) RuntimeException в других случаях.
        3. Реализуйте логику трех protected методов в ThisUncaughtExceptionHandler используя вызовы соответствующих методов согласно следующему шаблону:
        a) 1# : TooShortStringFirstThreadException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        б) java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : TooShortStringSecondThreadException : 2#
        в) RuntimeException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : 3#
        */
        public class Solution {
            public static void main(String[] args) {
                new Solution();
            }

            public static final String FIRST_THREAD_NAME = "1#";
            public static final String SECOND_THREAD_NAME = "2#";

            private Thread thread1;
            private Thread thread2;
            private Thread thread3;

            public Solution() {
                initThreads();
            }

            protected void initThreads() {
                this.thread1 = new Thread(new Task(this, "A\tB\tC\tD\tE\tF\tG\tH\tI"), FIRST_THREAD_NAME);
                this.thread2 = new Thread(new Task(this, "J\tK\tL\tM\tN\tO\tP\tQ\tR\tS\tT\tU\tV\tW\tX\tY\tZ"), SECOND_THREAD_NAME);
                this.thread3 = new Thread(new Task(this, "\t\t"), "3#");

                Thread.setDefaultUncaughtExceptionHandler(new ThisUncaughtExceptionHandler());

                this.thread1.start();
                this.thread2.start();
                this.thread3.start();
            }

            public String getPartOfString(String string, String threadName) {
                String result = null;
                try
                {
                    int i = string.indexOf("\t");
                    int j = string.lastIndexOf("\t");
                    result = string.substring(i+1,j);
                } catch (Exception e)
                {
                    if (threadName.equals(FIRST_THREAD_NAME))
                        throw new RuntimeException(e.getMessage(), new TooShortStringFirstThreadException(e));
                    else if (threadName.equals(SECOND_THREAD_NAME))
                        throw new RuntimeException(e.getMessage(), new TooShortStringSecondThreadException(e));
                    else throw new RuntimeException(e.getMessage(), new RuntimeException(e));
                }
                return result;
            }
        }

        package com.javarush.test.level22.lesson05.home01;

        public class ThisUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                final String string = "%s : %s : %s";
                if (Solution.FIRST_THREAD_NAME.equals(t.getName())) {
                    System.out.println(getFormattedStringForFirstThread(t, e, string));
                } else
                    if (Solution.SECOND_THREAD_NAME.equals(t.getName())) {
                        System.out.println(getFormattedStringForSecondThread(t, e, string));
                    } else {
                        System.out.println(getFormattedStringForOtherThread(t, e, string));
                    }
            }

            protected String getFormattedStringForOtherThread(Thread t, Throwable e, String string) {
                return String.format(string, e.getClass().getSimpleName(), e.getCause().getMessage(), t.getName());
            }

            protected String getFormattedStringForSecondThread(Thread t, Throwable e, String string) {
                return String.format(string,e.getCause().getMessage(), e.getCause().getClass().getSimpleName(), t.getName());
            }

            protected String getFormattedStringForFirstThread(Thread t, Throwable e, String string) {

                return String.format(string, t.getName(), e.getCause().getClass().getSimpleName(), e.getCause().getMessage());
            }
        }

    package com.javarush.test.level22.lesson05.home01;

    public class TooShortStringFirstThreadException extends RuntimeException {
    public TooShortStringFirstThreadException (Exception e) {super(e);}
    }

    package com.javarush.test.level22.lesson05.home01;

    public class TooShortStringSecondThreadException extends RuntimeException {
    public TooShortStringSecondThreadException (Exception e) {super(e);}
    }

Вывод:

1#A B   C   D   E   F   G   H   I
1#B C   D   E   F   G   H
1#C D   E   F   G
1#D E   F
1#E
2#J K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
2#K L   M   N   O   P   Q   R   S   T   U   V   W   X   Y
2#L M   N   O   P   Q   R   S   T   U   V   W   X
2#M N   O   P   Q   R   S   T   U   V   W
2#N O   P   Q   R   S   T   U   V
2#O P   Q   R   S   T   U
2#P Q   R   S   T
2#Q R   S
2#R
3#      
3#
java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : TooShortStringSecondThreadException : 2#
RuntimeException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : 3#
1# : TooShortStringFirstThreadException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1

задан 11 Янв, 04:39

Lezenford's gravatar image

Lezenford
2355
одобрено: 33%

изменено 11 Янв, 16:41

Если честно, то я не помню эту задачу. Я показал вывод моего уже проверенного решения. Посмотрите на info.javarush.ru

(11 Янв, 16:51) Yuri_Dnepr

Нет, я то не против, но в задаче четко указан формат: a) 1# : TooShortStringFirstThreadException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1 б) java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : TooShortStringSecondThreadException : 2# в) RuntimeException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : 3#

(11 Янв, 16:47) Lezenford

Я не настаиваю :)
Вы это валидатору скажите. Хотя могу конечно ошибаться.

(11 Янв, 16:44) Yuri_Dnepr

Нет такой - у вас неверно относительно шаблона обработаны исключения. Добавил свой вывод в код в конец

(11 Янв, 16:42) Lezenford

У вас явно не такой

(11 Янв, 16:07) Yuri_Dnepr

Вывод:

    1#A B   C   D   E   F   G   H   I
    1#B C   D   E   F   G   H
    1#C D   E   F   G
    1#D E   F
    1#E
    2#J K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
    2#K L   M   N   O   P   Q   R   S   T   U   V   W   X   Y
    2#L M   N   O   P   Q   R   S   T   U   V   W   X
    2#M N   O   P   Q   R   S   T   U   V   W
    2#N O   P   Q   R   S   T   U   V
    2#O P   Q   R   S   T   U
    2#P Q   R   S   T
    2#Q R   S
    2#R
    3#
    3#
    1# : TooShortStringFirstThreadException : null
    RuntimeException : java.lang.StringIndexOutOfBoundsException: String index out of range: -1 : 3#
    null : TooShortStringSecondThreadException : 2#
(11 Янв, 16:07) Yuri_Dnepr

Неужели никто не знает?(

(11 Янв, 15:26) Lezenford

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

if (FIRST_THREAD_NAME.equals(threadName))
            throw new TooShortStringFirstThreadException(e);

Ну и соответственно, когда обрабатывает исключения в ThisUncaughtExceptionHandler , то .getCause() уже не нужен будет, т.е. e.getClass().getSimpleName(), e.getMessage() ...

ссылка

опубликован 11 Янв, 17:11

t952's gravatar image

t952
9786
одобрено: 46%

Поигрался с выводом, сделал как вы сказали + конструктор для RuntimeException поменял на с RuntimeException(e.getMessage(), new RuntimeException(e)); на RuntimeException(e) и тогда задачу приняло. Спасибо огромное! Хотя и странно - у меня вывод получился через родителя, но правильный, почему не понравилось...

(12 Янв, 01:44) Lezenford
Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×53

Задан: 11 Янв, 04:39

Просмотров: 65 раз

Отредактирован: 12 Янв, 02:02