Как я ловлю это исключение в Swing?

Не уверен, что для этого нужны оконные функции.

Приведенный ниже пример просто сам связывает таблицу и группы по продуктам C12.

CREATE TABLE sales_performance
(
 product_ID varchar(3) not null,
 sales_period varchar(4) not null,
 sales_qty char(2) not null,
 sales_index char(2) not null,
 product_sub char(3) not null,
 goal_met char(1)  not null,
 PRIMARY KEY (product_ID, sales_period)
)
blockquote>
INSERT INTO sales_performance
(product_ID,sales_period,sales_qty,sales_index,product_sub,goal_met) 
VALUES
 ('C12','0001','15','20','D71','Y')
,('D71','0001','07','09','C12','N')
,('F20','0001','25','30','C05','Y')
,('C05','0001','10','15','F20','N')
,('C12','0002','15','30','C05','Y')
,('C05','0002','12','06','C12','N')
,('D71','0002','30','20','F20','Y')
,('F20','0002','20','15','D71','N')
,('C12','0003','05','04','F20','N')
,('F20','0003','40','35','C12','Y')
,('D71','0003','20','20','C05','Y')
,('C05','0003','12','10','D71','N')
;
blockquote>
SELECT c12.*, sub.sales_index
FROM sales_performance c12
LEFT JOIN sales_performance sub 
  ON sub.sales_period < c12.sales_period 
 AND 
 (
    (sub.product_ID = c12.product_sub AND sub.goal_met = 'N') OR
    (sub.product_ID = c12.product_ID AND sub.goal_met = 'Y')
 )
WHERE c12.product_id = 'C12'
ORDER BY c12.product_ID, c12.sales_period, sub.product_ID
product_ID | sales_period | sales_qty | sales_index | product_sub | goal_met | sales_index
:--------- | :----------- | :-------- | :---------- | :---------- | :------- | :----------
C12        | 0001         | 15        | 20          | D71         | Y        | null       
C12        | 0002         | 15        | 30          | C05         | Y        | 15         
C12        | 0002         | 15        | 30          | C05         | Y        | 20         
C12        | 0003         | 05        | 04          | F20         | N        | 20         
C12        | 0003         | 05        | 04          | F20         | N        | 30         
C12        | 0003         | 05        | 04          | F20         | N        | 15         
blockquote>
SELECT 
 c12.*
 , ROUND(AVG(sub.sales_index),1) AS sales_index_goal
FROM sales_performance c12
LEFT JOIN sales_performance sub 
  ON sub.sales_period < c12.sales_period 
 AND 
 (
    (sub.product_ID = c12.product_sub AND sub.goal_met = 'N') OR
    (sub.product_ID = c12.product_ID AND sub.goal_met = 'Y')
 )
WHERE c12.product_id = 'C12' 
GROUP BY c12.product_ID, c12.sales_period
ORDER BY c12.product_ID, c12.sales_period;
product_ID | sales_period | sales_qty | sales_index | product_sub | goal_met | sales_index_goal
:--------- | :----------- | :-------- | :---------- | :---------- | :------- | :---------------
C12        | 0001         | 15        | 20          | D71         | Y        | null            
C12        | 0002         | 15        | 30          | C05         | Y        | 17.5            
C12        | 0003         | 05        | 04          | F20         | N        | 21.7            
blockquote> [ 1110] db <> скрипка здесь

9
задан George Stocker 11 April 2009 в 18:44
поделиться

5 ответов

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

  • поместите try / catch вокруг фактического кода, где происходит исключение: например, если это происходит в ответ на нажатие кнопки, обработанное ActionListener, поместите try / catch в ваш метод actionPerformed ();
  • или, оставьте исключение как необработанное исключение и добавьте обработчик необнаруженного исключения . Например:

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      public void uncaughtException(Thread t, Throwable e) {
        // ... do something with exception here ...
      }
    });

В дополнение к этому, вы должны в принципе указывать код запуска вашего пользовательского интерфейса в SwingUtilities.invokeLater () .

11
ответ дан 4 December 2019 в 13:05
поделиться

Swing запускает вещи в потоке диспетчеризации событий. Вы пытаетесь перехватить его в главном потоке.

И обратите внимание, что Swing не является потокобезопасным, вы также должны делать что-то в потоке диспетчеризации событий.

Чтобы перехватить исключение, вы можете переопределить какой-то метод из этого стека. trace, как метод рисования из вашего компонента.

И для меня это исключение выглядит как ошибка, которую вы должны исправить, а не что-то, что вы должны скрыть, поймав.

2
ответ дан 4 December 2019 в 13:05
поделиться

Runtime exceptions like ArrayIndexOutOfBoundsException shows a programmer mistake. So it might be better to fix them rather catching and silently chewing it.

Just a wild guess for the cause of exception. Something concurrently remove rows from the table model's datavector once the JTable starts to draw the data on screen.

2
ответ дан 4 December 2019 в 13:05
поделиться

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

Если если вы хотите установить блок try / catch, чтобы поймать эту конкретную проблему, я бы бросил его в метод рисования класса App. Переопределите его и поместите вызов super.paint в блок try catch.

Если вы хотите использовать универсальный способ перехвата необработанных исключений, взгляните на Thread.setUncaughtExceptionHandler . Вы вызываете этот метод с помощью обработчика исключений и можете работать со всеми исключениями, которые не попадают в ваше приложение.

0
ответ дан 4 December 2019 в 13:05
поделиться

Единственные подходящие способы, которые мне известны, для того, чтобы отлавливать исключения, выбрасываемые из EDT, это:

  • написать свой собственный EventQueue (я не буду в общем, советуйте)
  • используйте внутреннее свойство Swing " sun.awt.exception.handler " (я использую это и работает на всех Sun JDK 1.4, 1.5 и 1.6 минимум, плюс на IBM JDK 1.4 и 1.5 минимум; Я не проверял это на других JDK, хотя)

Вы должны взглянуть на эту ветку , чтобы получить более полный обзор решений с их плюсами и минусами.

1
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: