Javaプログラムを実行するまでの手順について①

<< 実行環境 >>
OS : Windows11
エディター : メモ帳
JDK : OpenJDK 18

javacコマンドとjavaコマンド

ここではJavaプログラムを実行するまでの手順を書いていきます。
まだ何もわからないけどこれからJavaについて勉強していくぞー!な人へ向けたあっさりめの内容にしていくことを一応の目標としていますので、「そもそもJavaとはなんぞや?」とか「実行環境はどうやって用意すればいいの?」とか「中間コード? JVM?」とかについては申し訳ないですがばっさり省略します。気が向いたら個別の記事として書きます。

さてJavaプログラムを処理していくには、ざっくり書くと以下の手順で進めていく必要があります。

  1. Java言語の文法に従ってコードを記述していき、ソースファイルを保存する。ソースファイルの拡張子は「.java」にすること。

  2. javacコマンドを実行してファイルを翻訳(コンパイル)し、クラスファイルを作成する。クラスファイルの拡張子は「.class」になる。

  3. javaコマンドを使用してクラスファイルを実行する。

  4. (プログラム内容を処理する過程またはその結果におかしなところがなければ)処理が完了する。


文字だけだとなんだかわかりづらいので実際に実行していきたいと思います。
まず動作確認用に「Hello World!」と表示するだけの簡単なMainクラスを作成します。見せるほどでもないけど内容はこんな感じ。

//「Hello World!」と表示するMainクラス

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

この記事を読んでいる段階では「クラスってなに?」「は? なんだこの呪文みたいなやつは……」と思う人もいるかもしれませんが、今は特に気にしなくて大丈夫です。それらについての説明は後日(という名の別の記事に)改めて行う予定ですので、今はjavacコマンドとjavaコマンドの使い方を知ってもらえたらと思います。
さて、今回はテスト用ディレクトリとしてC:¥Java¥srcを作成しています。そこに先程内容をお見せしたMain.javaファイルを保存したので、コマンドプロンプトでcdコマンドを実行してディレクトリ移動をし、Main.classファイルを作成します。

< コマンド構文 > Javac ソースファイル名

ソースファイルの保存場所を確認!
cdコマンドというディレクトリ移動を行うコマンドを実行して
ソースファイル保存場所に移動後、javacコマンドを発動
クラスファイル(今回の例ではMain.class)が作成できたらコンパイル成功!

ここまで終えたら、次はJavaコマンドでプログラムを実行します。

< コマンド構文 > Java クラス名

今回の例で言うと、クラス名は「Main」です。
特に問題がなければ、実行結果が次の行に表示されます。

「Hello World!」と表示されました

eclipseでコーディングしていたり(後日説明しようかなと思案中の)ソースファイルモードで実行したりと、自分で明示的にコンパイルしない場合もあるとは思いますが、Javaプログラムが処理されていく一連の流れはいつもこうなっていると考えていきましょう。
個人的にはJavaを学習し始めた直後の人には、eclipseではなくあえてメモ帳やサクラエディタなどを使用してプログラムを実行してみてほしいなと思います。実際に体験してみると印象に残りやすいですからね。


コンパイルエラーと実行時例外

さて、先程のMain.javaファイル(とMain.classファイル)の処理結果は「コンパイルが正常に完了し、プログラムの処理内容にも問題がない場合の結果」になります。
様々な理由で問題が発生してプログラムを処理できない状態になることも、まああるわけです。次はこの問題とやらについて説明していきたいと思います。
では今度は意図的にエラーを発生させるコード、Test.javaを用意します。内容は以下の通り。

//クラス宣言にはclassという予約語が必要なのでコンパイルエラーになる
//いわゆるゼロ除算は計算不可能なので実行時例外になる

public Test {
    public static void main(String[] args) {
        int calc = 
        10 / 0;
        System.out.
        println(calc);
    }
}

このコードの問題点は2つ。
 ① 1行目に「class」という単語がない
 ② 10÷0という数学的に計算不可能なことを計算(して結果を表示)しようとしている

①はJava言語の構文として正しくない状態、②はJava言語の構文としては正しいけど「これって実行できなくないか?」な処理内容を(無理矢理)実行しようとしている状態であると言えます。
①がダメな理由はいつか別記事にしたいな~とは思っているので、とりあえずダメなものはダメなんだと知っておいてください。②がダメな理由は、表示しようとしていることではなく、不可能な計算をしようとしていることです。
それではこのコードを実行してみましょう。まずはjavacコマンドでコンパイルします。

なんか変な文章がたくさん出てきた!

コンパイルしようとしたら、Main.javaのときには表示されなかったものがずらーっと並んでいます。
ちょっとわかりづらいですが簡単に言うと「Test.javaの中身を確認してみたらきみが書いた文章、なんだか文法がおかしくて読めなかったよ! 内容が理解できなかったからコンパイル作業は取り止めるわごめんね! 〇行目のこの箇所がおかしい(と思う)からちゃんと直してよね!」とJava側が教えてくれています。
この状態がコンパイルエラーです。要するにコードとしての文法がおかしくてコンパイルできなかったときのことを指します。

余談ですがこのJava側が教えてくれる間違い箇所の情報、全部が全部合っているかというとそうではなく、だいたいの位置はここ!みたいな感じです。
その証拠に、このTest.javaでは1行目の「class」が無いだけで2行目以降の文法は問題ありません。「class」を書き足してもう一度javacコマンドを実行してもらうと正常にコンパイルできます。
実質的にミスは1箇所だけという場合もあれば本当にミスが数箇所ある場合もありますので、上の行から順に1つ1つ修正していくのが大切です。

ではコンパイルエラーとして指摘された箇所を訂正したら再度javacコマンドを実行してみましょう。今度はエラー表示されずに終了すると思います。
作成されたクラスファイル(Test.class)をjavaコマンドで実行します。

「Exception」は例外、「Arithmetic」は算術という意味

これまたよくない雰囲気のする文章が表示されました。
Java側の主張をざっくり簡単に言うと「Test.javaの3行目のコードを実行しようとしたら、こっちが想定していない例外的状況に陥ったから途中まで処理したけど中止しちゃうね! 今回の中止理由は『正しい計算ができなかったから』だよ!」です。
このように、文法はあっているけど実際にコードを実行する段階になっておかしな点が見つかり処理が中断されてしまう状態を実行時例外と言います。
実行時エラーやら非検査例外やら言われることもありますが、意味するところは同じです。
どうでもいい余談ですが、どちらかといえば私は実行時エラーではなく実行時例外呼び派です。エラーと聞くとErrorクラスがうっすら脳裏を過ってしまうという単なる感覚の問題なんで深い意味はないです。

まとめますと、コンパイルエラーは文法ミス、実行時例外は文法はあってるけどコードがおかしいミスということになります。
一口に「プログラムを実行できない」という状況でも発生原因は全く違います。特に勉強し始めたばかりの人はコンパイルエラーと実行時例外をごっちゃにしてしまいがちかもしれませんが、発生原因が違うので(しかも実行時例外の場合は原因が本当に多岐に渡ります)まずこの2つの違いをしっかり把握していけるようにしましょう。
というかOracle認定試験なんかではこの2つの違いを問われる場面に何度か直面する羽目になります、マジで。

エラー原因はちゃんとJava側が教えてくれているので、もし発生してしまってもそこを読んでしっかり修正していけばプログラムもきちんと実行できるようになりますよ。

この記事が気に入ったらサポートをしてみませんか?