<java> awtで"EXCEPTION_ACCESS_VIOLATION"が出たとき


前書き

大学のjavaの課題でawtを使おうとしたところ,大量のエラーが出て小一時間格闘したので解決策を残しておきます。
初めての記事なのでご了承ください。

環境

OS : Windows10
JDK : 15.0.1
JRE : 15.0.1

後述のエラー文にこのような記述があったのでそれを参考にしています。
vm_info: OpenJDK 64-Bit Server VM (15.0.1+9-18) for windows-amd64 JRE (15.0.1+9-18)

筆者はInteliJIDEA Ultimateをエディタとして利用しており,インストール時点でjdkもjreもなかったのでIDEAの指示に従って一番新しいものをインストールした形です。

症状

ソースコード
AWTGraphics.java
import java.awt.*;

public class AWTGraphics extends Canvas
{
    static final int WORLD_W = 320;
    static final int WORLD_H = 240;

    public void paint(Graphics g)
    {
        g.setColor(Color.red);
        g.drawLine(0, 0, WORLD_W, WORLD_H);
        g.setFont(new Font("Dialog", Font.PLAIN, 20));
        g.drawString("Hello, awt!", 0, WORLD_H / 2);
    }
    public static void main(String[] args)
    {
        Frame frame = new Frame("AWTGraphics");
        frame.setBackground(Color.black);
        AWTGraphics canvas = new AWTGraphics();
        canvas.setPreferredSize(new Dimension(WORLD_W, WORLD_H));
        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);
    }
}
正しく実行できたとき

エラー文(抜粋)
hs_err_pid4364.log
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff83d8902ae, pid=4364, tid=2572
#
# JRE version: OpenJDK Runtime Environment (15.0.1+9) (build 15.0.1+9-18)
# Java VM: OpenJDK 64-Bit Server VM (15.0.1+9-18, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C  [awt.dll+0x902ae]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   https://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

エラー文が長くてとても読めたものではないので先頭の数行分だけ載せています。
筆者もまともに読んでいません。

どうやらIDEAはとても優秀なようでスタックやメモリの状態まで詳細にエラーログとして出力してくれていますが,
ほとんど関係がないです。

注目すべきはここでしょうか

# C  [awt.dll+0x902ae]

どうやらこの"awt.dll+0x902ae"というJREにあるファイルが悪さをしている模様。
しかしJREの"/bin"ディレクトリにある.dllなのでこのファイルを直接書き換えたりはおそらくできません。

解決策①

実行するときにファイルエンコーディングで違う文字コードを指定してあげると治るみたいです。
筆者の環境ではデフォルトのファイルエンコーディングはUTF-8だったので,これをWindows-31j(Shift-JIS)に変えました。

InteliJIDEAで変えるとき

IDEAのSettings -> File Encodings
ここからGlobal Encoding をWindows-31jに変更しました。

しかしこれだとすべてのプロジェクト実行時にWindows-31jでエンコーディングすることになり,後々面倒なことになるかもしれません。
(詳しくはありませんが,特に理由がない限りはUTF-8でなるべくエンコーディングするのが好ましいと筆者は考えています)

その場合はProject Encodingだけ変更するのがいいかもしれません。

コマンドラインで変えるとき

ほとんどの場合こちらだと思います。bashやcmdでjavaコマンドを叩くときですね。
末尾にファイルエンコーディングオプションをつけてあげればいいです。

お好きなコマンドラインツールで
java -Dfile.encoding=windows-31j AWTGraphics 

ファイルエンコーディングを変える方法はいくつかあると思います。お好きなように。

解決策②


JREのバージョンを下げるのも方法の一つとして試されてる方がいました。
解決策①で治らない方は試してみるといいかもしれません。
しかし色々調べても,どこまでバージョンを下げれば治るのかがわからないので筆者は試していません。

参考資料

https://teratail.com/questions/297104
↑実際に試して筆者が解決した方法です