イベント ディスパッチャー スレッドにいない場合 (UI のボタンが押されたときなど)、アプリはクラッシュしません。割り当てが解除されるスレッドがクラッシュし、画像は取得されませんが、アプリは有効になります。
Thread を作成する可能性があります。または、Thread を拡張して run() メソッドをオーバーライドするか、Runnable インターフェイスを作成してそれをスレッド コンストラクターに渡します。
BufferedImage img = null;
try {
img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}catch(OutOfMemoryError err){
// your code will be here :)
}
画像の読み込み関数に入る前に、コードをデバッグ/ログに記録して、割り当て可能な最大メモリ量を確認してください。
// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();
// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();
// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();
50 MB の空き容量があり、ファイルが 50 MB の場合、ロードを試みる理由はありません。