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

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

01.09.2013, 16:22. Показов 1565. Ответов 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 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru