実行を理解する

実行は、生成したクラスを読み込んでmainから実際の処理を進める段階です。起動時の検索経路と引数、順次処理、実行時例外、標準出力を分けて追跡します。

この単元で学ぶこと

  • javaコマンドのクラス指定と引数を判断する
  • main本体の実行順と表示内容を追う
  • 実行時に失敗する入力や参照を判断する

本文解説

起動するクラスを指定 packageなしのMain.classが現在地にある場合、java -cp . Mainで起動できます。.は現在のディレクトリをクラス検索の対象にする指定です。Main.classというファイル名そのものではなく、Mainというクラス名を渡します。

パッケージ付きの検索 app.Mainをout/app/Main.classへ生成したなら、java -cp out app.Mainとします。クラスパスはパッケージ階層の根outで、起動名はapp.Mainです。out/appをクラスパスにしてMainと呼ぶと、内部のクラス名との対応が合いません。

コマンド引数の位置 java -cp out app.Main redでは-cp outがランチャー用の指定、app.Mainがクラス名、redがアプリケーションの引数です。argsにはredだけが入ります。クラス名の前後で文字列がどの役割に使われるかを確認します。

文の順序 int n=2;n*=3;n-=1;System.out.print(n);は5です。各代入を順に行い、最後の値を表示します。宣言だけから結果を決めず、実行した文によって状態がどう変わったかを追跡します。

出力の形式 System.out.print("A");System.out.print("B");は続けてABを表示します。printlnなら行区切りが追加されます。表示された改行コードの具体的な表現は環境によるため、複数行問題では行の内容と順序をまず区別します。ここでの文字列の比較問題はprintの内容を示します。

実行時の入力や値 配列の添字、除数が0か、参照がnullか等は、実行時の値から失敗することがあります。コンパイルが通ることと、あらゆる入力で正常終了することは同じではありません。例外が起きる演算より後のprintへ進むと決め付けないようにします。

標準出力とエラー System.outへ表示する通常の結果と、未処理例外の診断は別の出力経路です。例外問題では成功時の値が出るのではなく、その演算で処理が中断します。すでに表示した文字がある場合は消去されるわけではないため、どの文まで実行したかを見ます。

再起動の状態 この教材の単独のjava Main起動を終え、別のプロセスとして起動し直すと、staticフィールドもその実行環境で再び初期化されます。前のプロセスの変数が自動継続するわけではありません。ファイルなど外部へ保存したデータが残ることとは区別します。

図解

javaの起動と本体の実行
クラスが見つからない失敗と、本体に入ってからの例外は別の段階。

重要ポイント

  • -cpはクラス検索の根を指定する。
  • package付きの起動には完全修飾名を使う。
  • mainの各文は制御構造に従って順に処理する。
  • 実行時例外が起きると、処理しない限りその先へ通常通り進まない。

間違えやすい点

  • ソースを保存しただけで古いclassを実行しない。
  • エラー表示をプログラムの通常の標準出力と混同しない。
  • クラス検索の失敗をソース構文の失敗と混同しない。

用語解説

クラスパス
クラスを検索するディレクトリ等の経路。
完全修飾名
パッケージ名まで含めて特定する型の名前。
実行時例外
RuntimeExceptionを継承する例外。添字範囲外やnull参照などで発生する。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。