Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6459089

ArithmeticException with JEditorPane containing HTML

XMLWordPrintable

    • b80
    • 6
    • b97
    • generic
    • generic

      Compile and run the following test case. When it loads, hit PageUp or PageDown:

      import javax.swing.*;
      import java.awt.*;
      import java.awt.event.*;

      public class EPTest extends JFrame {
          
          public EPTest() {
              super("EPTest");
              
              JEditorPane ep = new JEditorPane();
              ep.setContentType("text/html");
              ep.setText("<html><body>abc</body></html>");
              ep.setEditable(false);
              getContentPane().add(new JScrollPane(ep));
              ep.setCaretPosition(0);
          }

          private static void createAndShowGUI(String[] args) {
              EPTest test = new EPTest();
              test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              test.setSize(400, 400);
              test.setLocationRelativeTo(null);
              test.setVisible(true);
          }
          
          public static void main(final String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                      createAndShowGUI(args);
                  }
              });
          }
      }

      The following exception is printed:

      Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException: / by zero
      at javax.swing.text.DefaultEditorKit$VerticalPageAction.actionPerformed(DefaultEditorKit.java:1414)
      at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1634)
      at javax.swing.JComponent.processKeyBinding(JComponent.java:2824)
      at javax.swing.JComponent.processKeyBindings(JComponent.java:2859)
      at javax.swing.JComponent.processKeyEvent(JComponent.java:2787)
      at java.awt.Component.processEvent(Component.java:5812)
      at java.awt.Container.processEvent(Container.java:2045)
      at java.awt.Component.dispatchEventImpl(Component.java:4407)
      at java.awt.Container.dispatchEventImpl(Container.java:2103)
      at java.awt.Component.dispatchEvent(Component.java:4237)
      at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
      at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
      at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:952)
      at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:824)
      at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
      at java.awt.Component.dispatchEventImpl(Component.java:4279)
      at java.awt.Container.dispatchEventImpl(Container.java:2103)
      at java.awt.Window.dispatchEventImpl(Window.java:2429)
      at java.awt.Component.dispatchEvent(Component.java:4237)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

      Can also be reproduced with SwingSet2:

        Start SwingSet2, select an Internal Frame (just click at "Frame 0")
        then switch to the "Source Code" tab, and when the source is
        loaded, hit PageDown.

      This is a regression introduced by the fix to 6244705.
      http://javaweb.sfbay/jcg/1.6.0-mustang/swing/6244705/src/share/classes/javax/swing/text/DefaultEditorKit.java.sdiff.html

      Previously, the code looked like:
      yOffset = direction * (int)Math.ceil(scrollAmount / (double)h) * h;

      Now there is:
      scrollAmount = direction * scrollAmount / h * h;

      The problem appears to be the fact that "h" is 0 when the caret position is within the header of the document. The new code, when dividing by 0, throws an exception. Previously, however, we were using doubles. The result of dividing by 0 was "Infinity", which was then casted to the int value 2147483647.

      It looks to me like both old and new code are wrong in their dealing with 0, but the previous code (at least) didn't throw an exception.

            peterz Peter Zhelezniakov
            shickeysunw Shannon Hickey (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: