«AWT-EventQueue-0» java.lang.NegativeArraySizeException, кажется, задерживает будущие потоки - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть приложение Swing, которое отображает файловую систему с JTree.Когда вы дважды щелкаете файл, его содержимое должно отображаться в JTextArea в JTabbedPane.У меня есть пользовательский SwingWorker, который, кажется, работает правильно для маленьких файлов, но не для больших.

Я считаю, что я правильно использую EDT.В doInBackground () я добавляю каждую строку выбранного файла в строку и возвращаю ее, чтобы get () могла ее использовать.В done () я добавляю строку в JTextArea, а затем добавляю ее в JTabbedPane.

При большом файле я получаю это исключение в самом конце чтения строк.После этой ошибки я не могу открыть больше файлов.В дампе потока я вижу, как создаются новые потоки SwingWorker, но они ждут, чтобы ThreadPoolExectuor что-то сделал.Я уверен, что это связано с этим исключением, но не уверен, как.Ошибка возникает в конструкторе DataBufferInt при создании массива данных.Это выглядит как создание изображения, но я не использую никаких изображений.

public DataBufferInt(int size) {
        super(STABLE, TYPE_INT, size);
        data = new int[size];
        bankdata = new int[1][];
        bankdata[0] = data;
    }

Исключение.

Exception in thread "AWT-EventQueue-0" java.lang.NegativeArraySizeException
    at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:75)
    at java.awt.image.Raster.createPackedRaster(Raster.java:467)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1032)
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:351)
    at com.apple.laf.AquaPainter$AquaSingleImagePainter.createImage(AquaPainter.java:193)
    at com.apple.laf.AquaPainter$AquaSingleImagePainter.lambda$paintFromSingleCachedImage$0(AquaPainter.java:178)
    at sun.awt.image.MultiResolutionCachedImage.getResolutionVariant(MultiResolutionCachedImage.java:66)
    at sun.awt.image.MultiResolutionCachedImage.getBaseImage(MultiResolutionCachedImage.java:106)
    at sun.awt.image.AbstractMultiResolutionImage.getWidth(AbstractMultiResolutionImage.java:82)
    at sun.awt.image.MultiResolutionCachedImage.getWidth(MultiResolutionCachedImage.java:89)
    at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3262)
    at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3214)
    at com.apple.laf.AquaPainter$AquaSingleImagePainter.paintFromSingleCachedImage(AquaPainter.java:186)
    at com.apple.laf.AquaPainter$AquaSingleImagePainter.paint(AquaPainter.java:141)
    at com.apple.laf.AquaPainter.paint(AquaPainter.java:90)
    at com.apple.laf.AquaGroupBorder.paintBorder(AquaGroupBorder.java:68)
    at com.apple.laf.AquaTabbedPaneUI.paintContentBorder(AquaTabbedPaneUI.java:661)
    at com.apple.laf.AquaTabbedPaneUI.paint(AquaTabbedPaneUI.java:134)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
    at javax.swing.JComponent.paintComponent(JComponent.java:780)
    at javax.swing.JComponent.paint(JComponent.java:1056)
    at javax.swing.JComponent.paintChildren(JComponent.java:889)
    at javax.swing.JComponent.paint(JComponent.java:1065)
    at javax.swing.JViewport.paint(JViewport.java:728)
    at javax.swing.JComponent.paintChildren(JComponent.java:889)
    at javax.swing.JComponent.paint(JComponent.java:1065)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5158)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4969)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:831)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Дамп потока.

"SwingWorker-pool-1-thread-3" #27 daemon prio=5 os_prio=31 tid=0x00007feffb972800 nid=0x7103 waiting on condition [0x000070000f827000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c04f3c08> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"SwingWorker-pool-1-thread-2" #25 daemon prio=5 os_prio=31 tid=0x00007ff00100a000 nid=0x73df waiting on condition [0x000070000f51e000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c04f3c08> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"TimerQueue" #24 daemon prio=5 os_prio=31 tid=0x00007ff0008e2000 nid=0x11817 waiting on condition [0x000070000f724000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c04e5470> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.DelayQueue.take(DelayQueue.java:211)
        at javax.swing.TimerQueue.run(TimerQueue.java:174)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - <0x00000006c04f7100> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

"SwingWorker-pool-1-thread-1" #23 daemon prio=5 os_prio=31 tid=0x00007feffb930800 nid=0x727b waiting on condition [0x000070000f621000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c04f3c08> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"JMX server connection timeout 21" #21 daemon prio=9 os_prio=31 tid=0x00007feffc281800 nid=0x7b07 in Object.wait() [0x000070000f41b000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168)
        - locked <0x00000006c01c96e0> (a [I)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"RMI Scheduler(0)" #20 daemon prio=9 os_prio=31 tid=0x00007feffca02000 nid=0x7a0f waiting on condition [0x000070000f318000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c01d47e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

Вотчасть кода.Я не был уверен, как создать это в меньшем масштабе, но, надеюсь, вы поймете, что он делает.У меня есть MouseAdapter (или Listener?), Который вызывается по двойному щелчку.Если узел (файл) не является каталогом, запустите Swing Worker, чтобы построчно собрать содержимое файла, а затем добавьте его в JTextField.

    class TreeMouseListener extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {

            if (e.getClickCount() == 2) {

                TreeNode selectedNode = (TreeNode) fileSystem.getLastSelectedPathComponent();

                File f;
                if (!(f = selectedNode.getFile()).isDirectory()) {

                    new openFileWorker(f).execute();

                }

            }

        }

    }

    class openFileWorker extends SwingWorker<String, Void> {

        File file;

        public openFileWorker(File f) {
            super();
            file = f;

        }

        @Override
        protected String doInBackground() throws Exception {
            BufferedReader reader = null;
            String line;
            String output = "";

            if (!"gz".equals(getFileExtension(this.file.getAbsolutePath()))) {

                try {
                    reader = new BufferedReader(new FileReader(file.getAbsolutePath()));
                    while ((line = reader.readLine()) != null) {
                        System.out.println(line);
                        output = output + line + "\n";
                    }
                    System.out.println(output);
                    return output;

                } catch (FileNotFoundException ex) {
                    Logger.getLogger(DossierView.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(DossierView.class.getName()).log(Level.SEVERE, null, ex);
                } finally {
                    try {
                        reader.close();
                    } catch (IOException ex) {
                        Logger.getLogger(DossierView.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

            } else {

                try {
                    GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(this.file.getAbsolutePath()));
                    reader = new BufferedReader(new InputStreamReader(gzip));
                    while ((line = reader.readLine()) != null) {
                        //System.out.println(line);
                        //fileText.append(line + "\n");
                        output = output + line + "\n";
                    }

                    return output;

                } catch (IOException ex) {
                    Logger.getLogger(DossierView.class.getName()).log(Level.SEVERE, null, ex);
                } finally {
                    try {
                        reader.close();
                    } catch (IOException ex) {
                        Logger.getLogger(DossierView.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

            }
            return null;
        }

        @Override
        public void done() {

            try {
                System.out.println(Thread.currentThread().getName());
                String text = (String) get();
                JTextArea fileText = new JTextArea();
                fileText.append(text);
                tabPane.add(this.file.getName().split("\\.")[0], fileText);

            } catch (InterruptedException | ExecutionException ex) {
                Logger.getLogger(DossierView.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
}
...