Статьи

Java — Отсутствует шрифт — Crashing App!

Eclipse MAT , Heaphero — все это популярные Java-инструменты для анализа больших дампов кучи. Недавно мы столкнулись с интересной проблемой при попытке проанализировать файл дампа кучи в Eclipse MAT. Инструмент падал из-за отсутствия шрифта ?. Мы думали, что поделимся с вами тем, что узнали.

ArrayIndexOutOfBoundsException в CompositeStrike.getStrikeForSlot ()

Вот наша среда:

  • Eclipse MAT 1.9
  • Java 8
  • Linux 3.10.0-862.34.2.el7.x86_64

Когда мы загрузили наш файл дампа кучи в Eclipse MAT, произошел сбой со следующей ошибкой:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
java.lang.ArrayIndexOutOfBoundsException: 0
               at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75)
               at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93
               at sun.font.FontDesignMetrics.initMatrixAndMetrics(FontDesignMetrics.java:359)
               at sun.font.FontDesignMetrics.<init>(FontDesignMetrics.java:350)
               at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:302)
               at sun.java2d.SunGraphics2D.getFontMetrics(SunGraphics2D.java:863)
               at org.eclipse.birt.chart.device.swing.SwingTextMetrics.reuse(SwingTextMetrics.java:123)
               at org.eclipse.birt.chart.device.TextAdapter.reuse(TextAdapter.java:36)
               at org.eclipse.birt.chart.device.swing.SwingTextMetrics.<init>(SwingTextMetrics.java:86)
               at org.eclipse.birt.chart.device.swing.SwingDisplayServer.getTextMetrics(SwingDisplayServer.java:194)
               at org.eclipse.birt.chart.device.DisplayAdapter.getTextMetrics(DisplayAdapter.java:138)
               at org.eclipse.birt.chart.computation.BIRTChartComputation.getTextMetrics(BIRTChartComputation.java:36)
               at org.eclipse.birt.chart.computation.LegendBuilder$LegendData.<init>(LegendBuilder.java:108)
               at org.eclipse.birt.chart.computation.LegendBuilder.compute(LegendBuilder.java:493)
               at org.eclipse.birt.chart.model.layout.impl.LegendImpl.getPreferredSize(LegendImpl.java:2059)
               at org.eclipse.birt.chart.internal.layout.LayoutManager$ChartLayout.<init>(LayoutManager.java:126)
               at org.eclipse.birt.chart.internal.layout.LayoutManager.doLayout_tmp(LayoutManager.java:1145)
 :
 :            
 :

Быстрый поиск в Google God показал эту интересную ветку StackOverflow . Вот краткий обзор этой темы. Java выполняет поиск шрифтов monospaced, SansSerif и serif с помощью функции fontconfig в linux. Linux fontconfig предназначен для поиска шрифтов в системе и их выбора в соответствии с требованиями, установленными приложениями. Если какой-либо из вышеперечисленных шрифтов отсутствует, это приведет к приведенному выше исключению

Если вы также столкнулись с проблемой такого типа, есть три возможных решения этой проблемы:

1. Установите отсутствующий шрифт

2. Обновите JDK

3. Отредактируйте конфигурацию шрифта ОС

Давайте обсудим решения в деталях.

1. Установите отсутствующий шрифт

Вы можете попробовать установить отсутствующий шрифт, выполнив следующую команду:

1
yum install dejavu-serif-fonts

2. Обновите JDK

Это известная ошибка JDK, отслеживаемая в базах данных ошибок JJK OpenJDK, Oracle и IBM:

Эта ошибка была исправлена ​​после следующих выпусков:

Открыть JDK 8u192

Oracle JDK 8u192

IBM JDK 8 SR5 FP37 (8.0.5.37)

Вы можете обновить до последней версии JDK, чтобы решить эту проблему.

3. Отредактируйте конфигурацию шрифта ОС

Создайте имя файла /etc/fonts/local.conf. В этом файле используется Utopia в качестве шрифта по умолчанию, используемого Java.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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>

Опубликовано на Java Code Geeks с разрешения Рама Лакшманана, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Java — Отсутствует шрифт — Crashing App!

Мнения, высказанные участниками Java Code Geeks, являются их собственными.