java - 将 RHEL 从 7.3 升级到 7.4 : ArrayIndexOutOfBoundsException in sun. font.CompositeStrike.getStrikeForSlot

标签 java awt redhat openjdk ibm-jdk

我们刚刚将服务器从 RHEL v7.3 升级到 v7.4

这个简单的程序在 RHEL v7.3 中运行,在 v7.4 中失败

public class TestJava {
  public static void main(String[] args) {
    Font font = new Font("SansSerif", Font.PLAIN, 12);
    FontRenderContext frc = new FontRenderContext(null, false, false);
    TextLayout layout = new TextLayout("\ude00", font, frc);
    layout.getCaretShapes(0);
    System.out.println(layout);
  }
}

RHEL 7.4 中的异常(exception)是:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75)
    at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93)
    at sun.font.Font2D.getFontMetrics(Font2D.java:415)
    at java.awt.Font.defaultLineMetrics(Font.java:2176)
    at java.awt.Font.getLineMetrics(Font.java:2283)
    at java.awt.font.TextLayout.fastInit(TextLayout.java:598)
    at java.awt.font.TextLayout.<init>(TextLayout.java:393)

在 RHEL v7.3 上的结果是:

sun.font.StandardTextSource@7ba4f24f[start:0, len:1, cstart:0, clen:1, chars:"de00", level:0, flags:0, font:java.awt.Font[family=SansSerif,name=SansSerif,style=plain,size=12], frc:java.awt.font.FontRenderContext@c14b833b, cm:sun.font.CoreMetrics@412ae196]

RHEL v7.4更新包括openjdk1.8.0.131更新到1.8.0.141 但这似乎与 openjdk 的版本无关,因为问题与 WebSphere v9.0IBM JDK 相同(v1.8.0 SR4 FP6)。在 RHEL v7.3RHEL v7.4 服务器上使用相同版本的 IBM JDK,该程序在 RH 7.3 中运行但失败在 RH 7.4 中使用与 openjdk

相同的方式

知道发生了什么吗?

最佳答案

我们终于找到了!
RHEL v7.4(从 v7.3 升级或全新安装)随附软件包 stix-fonts
安装此包时,默认字体从 Utopia 更改为 STIX 所以,现在 java 默认字体被映射到 STIX,包括 sans-serif 字体系列
无论出于何种原因,STIX 字体似乎不能很好地与 java (openjdk+ IBM JDK) 一起使用,并导致异常和错误的计算工件定位使用 java.awt 时,JasperReports
就是这种情况 我们以此结束创建文件名 /etc/fonts/local.conf 以强制返回 Utopia 作为 java 使用的默认字体..

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <alias>
    <family>serif</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>dialog</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>dialoginput</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
</fontconfig>

[2018-10-22 编辑]
看来这个错误在 JDK 1.8.192 中得到了修复:https://bugs.java.com/view_bug.do?bug_id=JDK-8188030

[2019-06-28 编辑]
现在有一个修复程序可以解决 IBM JDK v8.05.37 中包含的问题 http://www-01.ibm.com/support/docview.wss?uid=swg1IJ16655

关于java - 将 RHEL 从 7.3 升级到 7.4 : ArrayIndexOutOfBoundsException in sun. font.CompositeStrike.getStrikeForSlot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45569367/

相关文章:

java - 输入流返回 NullPointerException (Java)

java - 使用 AWT 设置 java 元素的大小

c - 在 Redhat 上安装 HAWQ

java - 跳过可选的 bean 引用属性

java - 使用 BASIC 身份验证集中保护所有 tomcat webapps

java - 在循环中将 Runnable 提交到线程池是一种好习惯吗?

java - 小程序中的按键故障

java - java JFrame 错误

compiler-errors - SOX : installing libmad make[1]: *** [all-recursive] Error 1 & make: *** [all] Error 2

linux - 如何在 redhat 上安装 jenkins 服务器