OpenSuse sun.font.FileFontStrike.getCachedGlyphPtr 中的 ArrayOutOfBoundsException

ArrayOutOfBoundsException in sun.font.FileFontStrike.getCachedGlyphPtr on OpenSuse

刚刚在 OpenSUSE Leap42.2j 上命中了这个异常。 Linux 4.4.49-16-默认使用 Java 1.8.0_73 25.73-b02 之前从未见过

看起来类似于此错误 http://bugs.java.com/view_bug.do?bug_id=7183251,但据说已在 2012 年修复。

错误修复了吗? 有什么办法可以避免吗?

java.lang.ArrayIndexOutOfBoundsException: -34602892
    at sun.font.FileFontStrike.getCachedGlyphPtr(FileFontStrike.java:472)
    at sun.font.FileFontStrike.getSlot0GlyphImagePtrs(FileFontStrike.java:438)
    at sun.font.CompositeStrike.getGlyphImagePtrs(CompositeStrike.java:115)
    at sun.font.GlyphList.mapChars(GlyphList.java:272)
    at sun.font.GlyphList.setFromChars(GlyphList.java:262)
    at sun.java2d.pipe.GlyphListPipe.drawChars(GlyphListPipe.java:103)
    at sun.java2d.pipe.ValidatePipe.drawChars(ValidatePipe.java:178)
    at sun.java2d.SunGraphics2D.drawChars(SunGraphics2D.java:3036)
    at sun.swing.SwingUtilities2.drawChars(SwingUtilities2.java:847)
    at javax.swing.text.Utilities.drawTabbedText(Utilities.java:187)
    at javax.swing.text.GlyphPainter1.paint(GlyphPainter1.java:119)
    at javax.swing.text.GlyphView.paintTextUsingColor(GlyphView.java:491)
    at javax.swing.text.GlyphView.paint(GlyphView.java:482)
    at javax.swing.text.BoxView.paintChild(BoxView.java:161)
    at javax.swing.text.BoxView.paint(BoxView.java:433)
    at javax.swing.text.BoxView.paintChild(BoxView.java:161)
    at javax.swing.text.BoxView.paint(BoxView.java:433)
    at javax.swing.text.ParagraphView.paint(ParagraphView.java:580)
    at javax.swing.text.html.ParagraphView.paint(ParagraphView.java:233)
    at javax.swing.text.BoxView.paintChild(BoxView.java:161)
    at javax.swing.text.BoxView.paint(BoxView.java:433)
    at javax.swing.text.html.BlockView.paint(BlockView.java:282)
    at javax.swing.text.BoxView.paintChild(BoxView.java:161)
    at javax.swing.text.BoxView.paint(BoxView.java:433)
    at javax.swing.text.html.BlockView.paint(BlockView.java:282)
    at javax.swing.plaf.basic.BasicHTML$Renderer.paint(BasicHTML.java:481)
    at javax.swing.plaf.synth.SynthToolTipUI.paint(SynthToolTipUI.java:187)
    at javax.swing.plaf.synth.SynthToolTipUI.update(SynthToolTipUI.java:141)
    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.JComponent.paintChildren(JComponent.java:889)
    at javax.swing.JComponent.paint(JComponent.java:1065)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
    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.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
    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.run(RepaintManager.java:831)
    at javax.swing.RepaintManager.run(RepaintManager.java:814)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    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.access00(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:756)
    at java.awt.EventQueue.access0(EventQueue.java:97)
    at java.awt.EventQueue.run(EventQueue.java:709)
    at java.awt.EventQueue.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
    at java.awt.WaitDispatchSupport.run(WaitDispatchSupport.java:184)
    at java.awt.WaitDispatchSupport.run(WaitDispatchSupport.java:229)
    at java.awt.WaitDispatchSupport.run(WaitDispatchSupport.java:227)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:227)
    at java.awt.Dialog.show(Dialog.java:1084)
    at java.awt.Component.show(Component.java:1673)
    at java.awt.Component.setVisible(Component.java:1625)
    at java.awt.Window.setVisible(Window.java:1014)
    at java.awt.Dialog.setVisible(Dialog.java:1005)

JOSM 的错误报告中讨论了类似的异常:Ticket #9729

用户“stoecker”提供了非常相关的信息:

The crashs happen when texlive-arphic-fonts is installed, but not arphic-gbsn00lp-fonts or arphic-bsmi00lp-fonts. Either one of the normal arphic fonts must be installed or the texlive variant must not be installed.

作为确认,这 2 个其他类似问题已通过删除 texlive-arphic-fonts 包得到解决:

openSUSE 也有关于此问题的公开错误报告:Bug 916052