С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241

Обработка исключений

01.09.2013, 16:22. Показов 1547. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть код, который записывает интернет страницу в 2 файла через промежуточный массив(буфер).

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public static void copy(InputStream in, OutputStream out1, OutputStream out2, int bufferSize) throws IOException
    {
        byte[] buffer = new byte[bufferSize];
        
        while ((in.read(buffer)) != -1)
        {
            out1.write(buffer);
            out2.write(buffer);
        }
    }
 
public static void main(String[] args) throws IOException
    {
        URL url = new URL("http://www.google.com");
        File file1 = new File("D:\\file1.txt");
        File file2 = new File("D:\\file2.txt");
        
        
        try(InputStream in = url.openStream();
                OutputStream out1 = new FileOutputStream(file1);
                    OutputStream out2 = new FileOutputStream(file2);)
        {
            copy(in, out1, out2, 2048);
            out1.flush();
            out2.flush();
        }
        catch(IOException IO_ex)
        {
            try
            {
                file1.delete();
            }
            catch(SecurityException secur_ex1)
            {
                IO_ex.addSuppressed(new IOException("Cant delete file " + file1));          
            }
            
            try
            {
                file2.delete();
            }
            catch(SecurityException secur_ex2)
            {
                IO_ex.addSuppressed(new IOException("Cant delete file " + file2));
            }
            
            throw IO_ex;
        }
    }
Условие - если где-то поламались(запись в оба файла не прошла), удалить оба файла, и если какой-то из файлов удалить не удалось, то создать исключение, в котором указать имя этого файла и добавить это исключение в suppression первого исключения

Вопрос: можно ли в принципе как-то сделать так, чтобы методы
Java
1
2
file1.delete();
file2.delete();
не разбивать на отдельные блоки try - catch?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2013, 16:22
Ответы с готовыми решениями:

Множественное возбуждение исключений
Есть задание : "Создайте три типа исключений. Напишите метод, возбуждающий каждое из них. В методе мэйн перехватите все три исключения...

обработка исключений
На собеседовании задали вопрос: "При обработке исключений есть ли какие-либо ограничения на вложеность"? И второй вопрос, если есть...

Обработка исключений
Доброго времени суток, помогите пожалуйста,вот задача: Скопировать файл, в другой файл. После копирования размер файла должны совпадать. ...

16
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
01.09.2013, 20:51
Код слегка пахнет и похоже на извращение:

Java
1
2
3
4
5
6
7
8
9
10
File temp= file1;
try{           
          file1.delete();
          
          temp = file2;
          file2.delete();
 
}catch(SecurityException secur_ex){
          IO_ex.addSuppressed(new IOException("Cant delete file " + temp));
}
0
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
01.09.2013, 22:39  [ТС]
Цитата Сообщение от Divizal Посмотреть сообщение
Код слегка пахнет и похоже на извращение:
Извращение - да

По вашему коду: а если удаление файла1 кинет исключение? имя какого файла запишется в suppression?
0
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
01.09.2013, 22:43
Цитата Сообщение от OxomHuK Посмотреть сообщение
Извращение - да

По вашему коду: а если удаление файла1 кинет исключение? имя какого файла запишется в suppression?
запишется имя файла1, т.к. когда бросает исключение - дальнейший код в блоке try не выполняется. Т.е. если бросает первый файл исключение, то передастся первый файл. Если кинет исключение при работе с файлом2, то передастся второй файл. При этом, если файл1 бросит исключение, то файл2 не будет удалятся. В целом, ваш первый вариант вполне рабочий. Кода хоть и больше, но зато второй файл хоть попытается удалиться, независимо от того удалился ли первый файл или нет.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.09.2013, 23:03
код не тестировал так просто накидал по вдохновению, могут быть мелкие синтаксические баги

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package io;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Observable;
import java.util.Observer;
 
/**
 * @author mutagen
 */
public class IoTransaction {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws MalformedURLException, IOException {
 
        BufObservable bufObservable = new BufObservable();
 
        URL url = new URL("http://www.google.com");
        File file1 = new File("D:\\file1.txt");
        File file2 = new File("D:\\file2.txt");
 
        InputStream is = url.openStream();
 
        boolean rezult = bufObservable.copy(is, file1, file2);
        System.out.println(rezult);
 
        is.close();
    }
 
    static class BufObservable extends Observable {
 
        private File f1;
        private File f2;
 
        public boolean copy(InputStream is, File f1, File f2) {
            this.f1 = f1;
            this.f2 = f2;
            try {
                if (!this.copy(is, new FileOutputStream(f1), new FileOutputStream(f2))) {
                    rollback();
                    return false;
                }
            } catch (FileNotFoundException ex) {
                rollback();
                return false;
            }
            return true;
        }
 
        private boolean copy(InputStream is, OutputStream os1, OutputStream os2) {
            ByteContainer byteContainer = new ByteContainer(1024);
            BufObserver bo1 = new BufObserver(byteContainer, os1);
            BufObserver bo2 = new BufObserver(byteContainer, os2);
            this.addObserver(bo1);
            this.addObserver(bo2);
            try {
                while ((is.read(byteContainer.getBuf())) != -1) {
                    setChanged();
                    notifyObservers();
                    if (bo1.getTransaction().isFailed()) {
                        return false;
                    }
                    if (bo2.getTransaction().isFailed()) {
                        return false;
                    }
                }
                return true;
            } catch (IOException ex) {
                return false;
            } finally {
                if (bo1.getOs() != null) {
                    try {
                        bo1.getOs().close();
                    } catch (IOException ex) {
                        return false;
                    }
                }
                if (bo2.getOs() != null) {
                    try {
                        bo2.getOs().close();
                    } catch (IOException ex) {
                        return false;
                    }
                }
            }
        }
 
        private void rollback() {
            if (f1 != null) {
                this.f1.delete();
            }
            if (f2 != null) {
                this.f2.delete();
            }
        }
    }
 
    static class Transaction {
 
        private boolean failed = false;
 
        public boolean isFailed() {
            return failed;
        }
 
        public void setFailed(boolean failed) {
            this.failed = failed;
        }
    }
 
    static class ByteContainer {
 
        private int size;
 
        public ByteContainer(int size) {
            this.size = size;
        }
        private byte[] buf = new byte[size];
 
        public byte[] getBuf() {
            return buf;
        }
 
        public void setBuf(byte[] buf) {
            this.buf = buf;
        }
    }
 
    static class BufObserver implements Observer {
 
        public BufObserver(ByteContainer buf, OutputStream os) {
            this.buf = buf;
            this.os = os;
        }
        private Transaction transaction = new Transaction();
 
        public Transaction getTransaction() {
            return transaction;
        }
        private ByteContainer buf;
        private OutputStream os;
 
        public OutputStream getOs() {
            return os;
        }
 
        @Override
        public void update(Observable o, Object arg) {
            try {
                os.write(buf.getBuf());
            } catch (IOException ex) {
                transaction.setFailed(true);
            }
        }
    }
}
такую модель легко можно раскидать на 2 потока
upd: малёха поправил, выкинул эксепшен из логики
2
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
01.09.2013, 23:12  [ТС]
имя какого файла запишется в suppression?

извиняюсь, я имел ввиду не какое имя запишется а то что запишется имя файла1 но файл2 не удалится.


При этом, если файл1 бросит исключение, то файл2 не будет удалятся.
Ваш код это не учитывает.

Добавлено через 1 минуту
Цитата Сообщение от mutagen Посмотреть сообщение
так просто накидал по вдохновению
ни..рена себе

Добавлено через 5 минут
mutagen, помилуйте, у меня была простая задача писать из УРЛ в 2 файла. Это так нужно писать правильно???
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.09.2013, 23:16
Цитата Сообщение от OxomHuK Посмотреть сообщение
Это так нужно писать правильно???
ну вообще из моей модели можно сделать и лучше, не в 2 файла а в 1 и более, так сказать более динамическое применение, мне просто лень )
а вообще все исключения перехвачены и обработаны, есть возможность устроить мультипоток и мультифайл, с точки зрения задела на будущее архитектура правильная.
Хотя конечно с непривычки может внушать некоторый ужас )))
Можно ещё улучшить(везде где 1, 2 сделать массив или лист), но так будет ещё больше текста )

Не по теме:

зыж Это энтерпрайз стиль )))

1
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
01.09.2013, 23:19  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
с точки зрения задела на будущее архитектура правильная.
Цитата Сообщение от mutagen Посмотреть сообщение
Хотя конечно с непривычки может внушать некоторый ужас
у нас с вами разная весовая категория.



Мой код правильно работает?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.09.2013, 23:23
Цитата Сообщение от OxomHuK Посмотреть сообщение
Мой код правильно работает?
скорее всего нет - не вижу закрытия потоков
0
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
01.09.2013, 23:34  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
не вижу закрытия потоков
Ну как же: 3 потока создаются в try с ресурсами, значит у них вызовуться close(). И сам я вызываю flush для потоков вывода, если поламается до флаша - то флаш в принципе вызывать не обязательно

Добавлено через 4 минуты
ваш код почти понял,
но написать такое не имея опыта с паттернами нереально
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.09.2013, 23:34
Цитата Сообщение от OxomHuK Посмотреть сообщение
Ну как же: 3 потока создаются в try с ресурсами, значит у них вызовуться close(). И сам я вызываю flush для потоков вывода, если поламается до флаша - то флаш в принципе вызывать не обязательно
А да есть, привычка искать файнал )

ну работать думаю он будет, но есть у меня по его поводу какое-то неясное впечатление бажности, может из-за того что не отработаны точки возможного возникновения NPE
0
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
01.09.2013, 23:34  [ТС]
приведите пожалуйста пример когда мой код сломается
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.09.2013, 23:36
Цитата Сообщение от OxomHuK Посмотреть сообщение
file1.delete();
file1 может быть null или папкой в некоторых случаях
1
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
01.09.2013, 23:38  [ТС]
я же говорю, у нас с вами очень разные весовые категории.

У меня была задача писать из УРЛ в 2 файла и удалить 2 огрызка если не получилось и обвешать трай-кетч.
А вы написали модель этого НАПЕРЕД, использовали шаблон наблюдатель, многопоточность т.д...
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.09.2013, 23:42
Цитата Сообщение от OxomHuK Посмотреть сообщение
я же говорю, у нас с вами очень разные весовые категории.
это дело привычки )
когда постоянно пишешь - привыкаешь писать наперёд, так как задачи очень часто меняются
оставляешь себе поле для деятельности, тут главное не сильно увлекаться, так как код сильно усложняется )

в случае моего примера принцип KISS не особо выдержан )))
0
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
02.09.2013, 00:07  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
file1 может быть null или папкой в некоторых случаях
провал.

Теперь начинаю понимать что значит бьют по рукам за плохой код

Добавлено через 21 минуту
последний тут вопрос: по вашему коду я вижу что вы внутри методов Копи используете try - catch. Я думал, что можно без трай-кетч, просто помечать метод как опасный словом throws и "пробрасывать' обработку ошибок дальше, пока какой-то метод, в котором вызывается метод Копи, не обработает эти ошибки.
Так как я думал нельзя?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
02.09.2013, 08:20
Цитата Сообщение от OxomHuK Посмотреть сообщение
последний тут вопрос: по вашему коду я вижу что вы внутри методов Копи используете try - catch. Я думал, что можно без трай-кетч, просто помечать метод как опасный словом throws и "пробрасывать' обработку ошибок дальше, пока какой-то метод, в котором вызывается метод Копи, не обработает эти ошибки.
Так как я думал нельзя?
можно - весь вопрос где будет заканчиваться обработка ошибок
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2013, 08:20
Помогаю со студенческими работами здесь

Обработка исключений
Доброго времени суток. Решил все таки отойти от привычной delphi, на замену была выбрана java, я в ней новичок т.ч. не пинайте сильно. ...

Обработка исключений
Здравствуйте! Помогите пожалуйста! У меня такое задание: Ввести с клавиатуры три целых числа (a, b, c). Определить, являются ли они...

Обработка исключений
можете помочь сделать свое исключение в этом коде, пожалуйста!) public static void main(String args) throws IOException { ...

Обработка исключений
Здравствуйте! Имеется такой код. // Демонстрация обработки исключений class ExcDemol { public static void main(String args(){ int...

Обработка исключений
Доброй ночи. Имеем матрицу 10х10 . Перепишем след. образом : на место каждого запишем среднее арифметическое соседей этого элемента. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru