Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 18

Генерация неконтролируемого исключения

03.01.2014, 15:31. Показов 1386. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С НГ, коллеги!

Пришла мне в НГ такая идея, поддаться соблазну и сгенерировать неконтролируемое исключение в Thread.

Вкратце:
1. создается диалоговое окно с JProgressBar и кнопкой Abort
2. пользователь нажимает кнопку Abort и возводится флаг aborted прерывания процесса. В принципе можно еще вызвать метод Thread.interrupt(), но это не принципиально.
3. В методе Run() флаг aborted контролируется, и если он поднят, то генерируется неконтролируемое исключение.

Плюсы, на мой взгляд, - не нужно описывать в заголовках методов исключения, к тому же, переопределяя методы, нельзя описать новое исключение.
Может немного кода прояснит ситуацию.
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
public class ProcessDialog extends JDialog {
 
    public ProcessDialog(Frame owner, String title, File imageFile) {
        boolean aborted = false;
        ProcessThread thread; // класс ProcessThread описан ниже
        JLabel statusLabel = new JLabel(" "));
        JProgressBar progressBar = new JProgressBar());
        ...
    }
 
    /* Action для кнопки, чтобы пользователь мог прервать процесс */
    class AbortAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            aborted = true;
        }
    };
 
    /* Метод запускает процесс и показывает этого диалог */
    public void startProcess(ProcessRunnable runnable) throws Exception {
        if (thread != null) { throw new Exception("startProcess already called"); }
        thread = new ProcessThread(runnable);
        thread.start();
        setVisible(true);
    }
 
    /* Неконтролируемое исключение */
    class AbortException extends Error {};
    
    class ProcessThread extends Thread {
        /* В этом методе ловится неконтролируемое исключение */
        public void run() {
            try {
                super.run();
            } catch (AbortException e) {
                aborted = true; /* на всякий случай еще раз поднимем флаг */
            }
        }
    }
 
    public class ProcessRunnable implements Runnable {
        /* В этом методе проверяется флаг и генерируется неконтролируемое исключение */
        protected void checktInterrupted() {
            if (aborted) throw new AbortException();
        }
}
Теперь можно делать наследника от ProcessDialog.ProcessRunnable и в методе Run() периодически вызывать checktInterrupted(), и если пользователь жмакнул на Abort, то сгенерируется исключение AbortException и поймается в ProcessDialog.ProcessThread.Run().

Прошу откоментироваться.
Порочна ли это практика?
Насколько я понял из литературы, неконтролируемые исключения - это Error и RuntimeException. Для меня, пока, они одинаковы. Не знаю, от кого лучше, для этих целей, наследовать исключение.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2014, 15:31
Ответы с готовыми решениями:

Генерация собственного исключения
Попытался кинуть исключение, не получилось. Хочу : Чтобы при вводе варианта (iNoVar) кроме 1го, выводило исключение. Вот написал, но машина...

Генерация исключения в конструкторе
Добрый вечер! У меня возник вопрос с генерацией и перехватом исключений. Имеется код: class Mystring { protected: int n; //хранит...

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

2
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
03.01.2014, 20:02
RuntimeException всегда на совести программиста
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
03.01.2014, 20:16
Не совсем политкорректный, но вполне работающий пример с фоновыми задачами. Окошки красивше лень было делать, но в принципе и так наглядно...
BackgroundWork.java
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
package easybudda.manybackgroundtasks;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Random;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JProgressBar;
import javax.swing.Box;
import javax.swing.JDialog;
import javax.swing.SwingWorker;
 
public class BackgroundWork implements ActionListener, PropertyChangeListener {
    public static final int MAX_SLEEP_TIME = 3000;
    public static final int MAX_STEP = 10;
    
    private JTextArea outputTextArea;
    private String workTitle;
    private JDialog progressDialog;
    private JProgressBar progressBar;
    private JButton abortButton;
    
    private Random rand = new Random();
    
    private SwingWorker<Void, Void> task = new SwingWorker<Void, Void>() {
 
        @Override
        protected Void doInBackground() throws Exception {
            
            setProgress(0);
            
            while ( ! isCancelled() && getProgress() < 100 ) {
                try {
                    Thread.sleep(rand.nextInt(MAX_SLEEP_TIME));
                }
                catch ( InterruptedException igcnored ) {}
                
                int p = getProgress() + rand.nextInt(MAX_STEP);
                setProgress( p > 100 ? 100 : p );
            }
            
            return null;
        }
        
        @Override
        public void done() {
            if ( isCancelled() ) 
                outputTextArea.append(workTitle + " was cancelled at " + getProgress() + " percents.\n");
            else
                outputTextArea.append(workTitle + " finished.\n");
 
        }
        
    };
    
    BackgroundWork(String title, JTextArea out) {
        workTitle = title;
        outputTextArea = out;
        
        progressBar = new JProgressBar();
        abortButton = new JButton("Abort");
        abortButton.addActionListener(this);
        Box box = Box.createVerticalBox();
        box.add(progressBar);
        box.add(abortButton);
        progressDialog = new JDialog();
        progressDialog.setTitle(workTitle);
        progressDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        progressDialog.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent we) {
                task.cancel(false);
            }
        });
        progressDialog.add(box);
        progressDialog.pack();
        progressDialog.setVisible(true);
        
        task.addPropertyChangeListener(this);
        task.execute();
        
        outputTextArea.append(workTitle + " started.\n");
    }
    
 
    @Override
    public void propertyChange(PropertyChangeEvent pe) {
        if ( "progress".equals(pe.getPropertyName()) ) {
            int p = (Integer)pe.getNewValue();
            progressBar.setValue(p);
            progressDialog.setTitle(workTitle + " - " + p + "%");
            if ( p == 100 )
                progressDialog.setVisible(false);
        }
    }
 
    @Override
    public void actionPerformed(ActionEvent ae) {
        task.cancel(false);
        progressDialog.setVisible(false);
    }
 
}

MainApp.java
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
package easybudda.manybackgroundtasks;
 
import javax.swing.*;
import java.awt.event.*;
 
public class MainApp {
    public static final int OUTPUT_ROWS = 10;
    public static final int OUTPUT_COLUMNS = 40;
    
    private JTextArea outputTextArea;
    private JButton workButton;
    private int workersCount = 0;
    
    MainApp() {
        outputTextArea = new JTextArea(OUTPUT_ROWS, OUTPUT_COLUMNS);
        workButton = new JButton("New worker...");
        workButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                new BackgroundWork("Worker #" + (++workersCount), outputTextArea);
            }
        });
        JScrollPane scrollPane = new JScrollPane(outputTextArea);
        Box box = Box.createVerticalBox();
        box.add(scrollPane);
        box.add(workButton);
        
        JFrame mainFrame = new JFrame("Background workers");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.add(box);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainApp();
            }
        });
    }
}


Не по теме:

Upd Вместо MainApp.java два раза BackgroundWork.java был, исправил.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.01.2014, 20:16
Помогаю со студенческими работами здесь

Генерация исключения bad_alloc в new
Прочитал, что в случае невозможности выделения памяти new возвращает 0, либо генерит bad_alloc. Пытаюсь обработать bad_alloc (на случай,...

Генерация исключения для объекта производного класса
Здравствуйте. Имеется такой код #include &lt;iostream&gt; class A{ public: virtual void PrintMsg(){ std::cout &lt;&lt;...

Генерация исключения в своем классе при невозможности построить треугольник
Задача:&quot;Описать класс, представляющий треугольник. Предусмотреть методы для создания объектов, перемещения на плоскости, изменения размеров...

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class SQLEntityException : ApplicationException ...

Исключения
Проверить входной файл на то, правильно ли в нём использованы многострочные комментарии/* */. Я не поняла. Можете мне объяснить, как это...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru