Developer

【はじめてのJava】実行時に発生する問題【プログラムの作り方編】
2020.09.25
Lv1

【はじめてのJava】実行時に発生する問題【プログラムの作り方編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


プログラムの作り方編

プログラムの作成と実行の記事ではソースコードを作成、保存ソースコードのコンパイルプログラムの実行を行いました。
Javaの仕組みの記事ではJVMmainメソッドSystem.out.println()について説明しました。

今回は開発時のコツの1つとして、プログラムが上手く作成・実行できないときの原因と対処法を解説していきます。


開発時の注意点

ここではプログラム作成時のコツを見ていきます。プログラムはコツをつかむことで、作成にかかる時間が短くなったり、動かした際の問題点が起こりづらくなったりします。

今回はプログラムが上手く動かないときののポイントを紹介します。項目が多いので、一度に全部理解しきれなくて大丈夫です。不明点はあとから見返して少しずつ理解を深めていただければと思います。

Javaの試験を受ける場合は、別のシリーズとして執筆予定の例外処理シリーズを読んだ段階で「コンパイルエラー」「実行時例外」の2つが意識できれば大丈夫です。

なお、説明中に「Exception系」「RuntimeException系」「Error系」という言葉が出てきますが、これは便宜上筆者が付けた名称ですのでjavaで正式に使われている言葉ではありません。ご注意ください。


目次


実行時に発生する問題

 実行時に発生する問題 とは、プログラムの実行中に何らかの問題が発生してプログラムの実行が停止することです。実行時に発生する問題には2種類あります。

「Javaの文法上の形式は守られているものの意味的におかしな部分が含まれている場合(RuntimeException系)」と「JVMにとって致命的な問題が発生した場合(Error系)」です。

RuntimeException系は、例えるなら、「I eat a pen.」と書かれた台本(ソースコード)をJVM用に翻訳し、実際にそれを実行した状態です。「I eat a pen.」は文法上はおかしくないためコンパイルエラーにはなりません。しかし翻訳語、台本通り「I eat a pen.」を行うといろいろな問題が発生します。

Error系は、例えるなら、台本通りに演じていたら突然停電してしまった状態です。それ以上実行を続けることができないためプログラムの実行が止まります。

2つのどちらなのかは、実行時に発生した問題の名前の末尾からある程度推測できます。(ぱっと見で区別できなくても、調べられれば十分です。)


実行時に発生する問題の例

以下は実行時に発生する問題の例です。 プログラムの実行中に問題が発生したこと  発生した問題の種類 が書かれています。

エラーメッセージの内容を見ると Sample.javaの3行目 に書かれていた内容を実行しようとして問題が発生したことが分かります。発生した問題は ArrayIndexOutOfBoundsException という名前であることもわかります。このArrayIndexOutOfBoundsExceptionはRuntimeException系の問題です。

実行時に問題が発生した場合はまずRuntimeException系なのかError系なのか確認します。どちらなのかによって少し対応が変わります。


よくある実行時に発生する問題の原因

以下に実行時に発生する問題の例を挙げます。まだこのシリーズで扱っていない内容も書いてありますので、今はそれぞれの内容を理解できなくて問題ありません。

  • 整数を0で割っている(RuntimeException系)
  • 数字に変換できない文字を数字に変換しようとした(RuntimeException系)
  • 配列で存在しないインデックスを使用している(RuntimeException系)
  • nullに対してメソッド呼び出しを実行した(RuntimeException系)
  • 再帰呼び出しによるメモリ不足(Error系)

対処方法

実行時に問題が発生した場合は 発生した問題の名前 をもとにRuntimeException系なのかError系なのかを確認し、その後対処を行います。

RuntimeException系の場合

RuntimeExceptionの場合はソースコード内に原因がある可能性が高いので、「 どこで 」「 どんな 」問題が起こったのかを確認し、ソースコードを修正します。

その後ソースコードを保存し再コンパイルを行ってから実行します。ソースコードの保存やコンパイルを忘れると修正が反映されないので注意してください。

Error系の場合

Error系の場合は、一部を除いてソースコード以外の部分に問題があります。例えばコンピュータのスペックが足りなかったり、JVMが壊れていたり、といったことが疑われます。

実際に開発を行う上ではError系は原因を探らないとまずいですが、原因を探るためにはプログラム以外の様々な部分も考慮しないといけません。Javaの学習をしている段階では、同じErrorが頻発しなければいったん気にせずに学習を進めたほうが良いでしょう。


ポイント

実行時に発生する問題には、「RuntimeException系」の問題と「Error系」の問題の2種類がある。
「RuntimeException系」の問題は例えるなら台本(ソースコード)に「I eat a pen.」と書かれており、それを実行した状態。ソースコードを修正して対応する。
「Error系」の問題は例えるなら上演(実行)中に突然停電し、それ以上続けることができない状態。ハードウェアなども含めた原因の特定が必要。


プログラムの作り方編・次回の内容

これでJavaのプログラムの作成方法と実行方法が分かりました。プログラムの作り方編・次回仕様違反について説明していきます。


はじめてのJavaシリーズの記事一覧はこちら
シリーズ全記事一覧
環境構築編
プログラムの作り方編
データ型と変数編


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら