最初の例・演習


標準入力・標準出力・標準エラー出力の利用

パソコンデスクトップ用Javaでは、

キーボードから何かを入力し、
画面に何かを表示

するために、下表に示す、System クラス (正確には java.lang.System クラス) の public な static変数 が利用できる。

名前内容static変数
標準入力
コンソールプログラムの入力として使われる。
通常状態ではキーボードと結びついている。
System.in
java.io.InputStream オブジェクト
標準出力
コンソールプログラムの一般的な出力用として使われる。
通常状態ではコンソール画面と結びついている。
System.out
java.io.PrintStream オブジェクト
標準エラー出力
コンソールプログラムで、エラーや警告等の出力用として使われる。
通常状態ではコンソール画面と結びついている。
System.err
java.io.PrintStream オブジェクト

プログラム起動時の指定により、標準入力をファイルに結びつけて、そのファイルの内容をプログラムへの入力とすることや、標準出力あるいは標準エラー出力をファイルに結び付けて、プログラムからの出力をそのファイルに書き出すことができる。これを リダイレクション と言う。

行入力

System.in (java.io.InputStream クラスのオブジェクト) でバイト単位の入力はできるのだが、行入力・整数入力等は自前でコードを記述する必要があり、使い勝手がよくない。

Java SEで利用できる入力方法で、使い勝手の良いものには下記に示すようなものがある。

本講義では BufferedReader による行入力を使う。下記のように、まずソースファイル先頭付近に

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;

というimportを入れて、IOException クラス, InputStreamReader クラス, BufferedReader クラスを単純名で扱えるように指定した上で、mainメソッドの最初の方で、

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

のようにして、System.in を基に、行入力 readLine メソッドを持つ BufferedReader オブジェクトを生成し、変数 br に代入する。

なお、Java 10以降では、var という用語を使って、自動で変数の型を推論する機能、型推論 (type inference) が使えるので、上のコードの代わりに、下記のように少し簡略化した書き方ができる。

    var br = new BufferedReader(new InputStreamReader(System.in));

入力はすべて BufferedReader の行入力 br.readLine() の結果を String 変数 で受け取る形で行うこととする。

ただし、readLine メソッドは、入力に失敗したとき IOException クラスの例外を投げるので、try 〜 catch などの方法で受け取り、例外処理をする必要がある。まとめると、例えば下記の形で利用できる。

    String s = ""; // 例えば、変数 s を空文字列で初期化しておく
    
    …
    
    try {
        s = br.readLine();
    } catch (IOException e) {

        // ここで、入力エラーのときの処理をする

    }

    // 正常入力できた
    // 変数 s を使って何らかの処理を行う
    
    …

改行なし出力と改行を付加する出力

System.out および System.err (java.io.PrintStream クラスのオブジェクト) では、下記メソッドが多く使用される。

改行なし出力 …… 各種の print メソッド

各種のパラメータを文字列として出力する。

改行を付加する出力 …… 各種の println メソッド

各種のパラメータを文字列として出力し、最後に改行を一つ付加出力する。
パラメータのない println メソッドは改行一個のみを出力する。

書式を指定する出力 …… printf メソッド (J2SE 5.0以降)

パラメータとして書式文字列を受け取り、その書式に沿って後続パラメータ等を出力する。
書式文字列はC言語の printf 関数のものと類似している。書式文字列中では、改行は \n でなく %n という指定になる。

例外処理

Javaでは、通常の処理の流れに沿わない特別な事項が発生したときに 例外 (exception) を発生させ (「例外を投げる」と言う)、その例外を指定された例外処理コードで受け取り処理する。

例外は下記の2つに大きく分かれる。

チェック例外
発生したかどうかをチェックする必要がある例外。
メソッドが発生させる可能性のあるチェック例外はメソッドの throws で指定されている。
throwsがあるメソッドを呼び出す場合は、そこにリストされた例外を捕捉して処理を行うか、あるいは、呼び出し元のメソッド自身にも同じ throws を記述してさらに上のレベルのメソッドに例外を渡し処理を任せる必要がある。
非チェック例外
発生したかどうかをチェックする必要はない例外。
ただこの種の例外が発生して何も例外処理を行わないとプログラム全体が停止してしまうので、それを避けたい場合は例外処理のコードを記述する。

例外処理を記述するには、try 〜 catch 〜 finally 文 を使う。

	try {

		// 通常の処理
		// ここで発生した例外を下の catch によって捕えることができる

	} catch (例外クラス名 捕捉用変数) {

		// 捕捉した例外の処理

	} finally {

		// 例外が発生してもしなくても最後に実行される処理

	}

複数の例外を捕捉したい場合は複数の catch を記述する。上から順に見て、例外の型が最初に一致した catch の処理が実行される。

捕捉する例外がない場合は catch を書かなくてもよい。最後に実行させたい処理がない場合は finally を書かなくてもよい。

発生した例外は、対応する catch がない場合はさらに上のレベルの呼び出し元メソッドに伝播していく。
一番上のレベル (アプリケーションの場合、主クラスのmainメソッド) でも処理されない例外があると、例外発生の内容を表示してプログラムが異常終了する。

コメント

行コメント

//

は、そのカラム位置以降の行テキストをコメントにする。
行の全体、あるいは、行のある箇所以降右側部分をコメントとするときに使用する。

複数行に渡ってもよいコメント

/*

で始まり

*/

で終わる区間はコメントとなる。複数行に渡るコメントでもよいし、1行内のごく狭い範囲のコメントでもよい。

javadocコメント

javadocコメントはプログラムコードの説明を文書化するためのコメントである。

/**

で始まり

*/

で終わる区間はjavadocコメントとなる。

javadocコメント内では、@author, @param, @return, @throws などのjavadocタグを使用して、対象項目 (クラス、メソッド、フィールド等) の説明をすることができる。

一般的には、下記のように、複数行でカラムを揃えて記述する。

/**
 * 対象とする項目 (クラス、メソッド、フィールド等) の説明.
 *
 * @javadocタグ1  説明
 * @javadocタグ2
 */

javadocタグの一部を下表に示す。

名前対象使い方内容
@author
クラス
インタフェース
パッケージ
@author 著者名
@author 著者名のコンマ区切りリスト
著者。著者のリスト
@paramメソッド @param パラメータ名 説明 メソッドあるいはコンストラクタのパラメータの説明
@returnメソッド @return 説明 メソッドの返り値の説明
@throwsメソッド @throws 例外クラス名 説明 メソッドあるいはコンストラクタが投げる可能性のある例外の説明

Java の JDK に付属する javadoc コマンド を使って、ソースコードから説明文書を生成させることができる。


以下では、上記をふまえて、Javaプログラムのごく簡単な例を示し、また、その応用として演習問題をやってもらう。


最初の例

最初は、動作するプログラム全体を示す。
入力・コンパイル・実行の方法については、

Javaアプリケーションのコンパイル・実行

を参考にすること。

例題1:
2つの整数 a, b を入力し、和・差 (a - b) を表示するプログラム。整数 b は 0 でないとし、0 が入力されたらエラーを表示し終了する。

例題1ソース前半
例題1ソース後半

※ javadoc によるドキュメント生成
以下のコマンドで、HTML文書形式のドキュメントが作成できる。

javadoc  -package  -author  Rei1.java

今回出てきた重要事項

基本データ型 (プリミティブ型)

データ型のページも参照。

種類型名ビット数内容・範囲
整数型byte8-128 から 127
short16-32768 から 32767
int32-2147483648 から 2147483647
long64-9223372036854775808 から 9223372036854775807
浮動小数点型float32IEEE規格。単精度
double64IEEE規格。倍精度
論理型boolean1true (真) または false (偽)
文字型char16Unicode (UTF-16) で表される文字。'\u0000' (= 0) から '\uffff' (= 65535)

文字列 : String クラス

Javaでは、文字の並びを「文字列」として、String クラス (正確には、java.lang.String クラス) のオブジェクトで表す。

また、ダブルコーテーションで囲んで、固定した文字列 (文字列リテラル) を表現できる。

"文字列 もじれつ ストリング String"

1文字でも構わない。

"あ"

0文字の文字列も許される。空(から)文字列という。

""

文字列の連結

文字列を表すクラス String のオブジェクトはプラス演算子(+)で連結でき、新しいStringオブジェクトを生成する。
※ Java で唯一といっていい演算子オーバーロード

例:

int wa = 7;
System.out.println( "和 = " + wa );
System.out.println( wa + wa );

この例の最初の + ように、片方がStringでなくても、もう一方が String ならば、Stringとして連結される。次の行の + は、対象が両方とも int なので、普通に加算が行われる。
上記を main メソッドに入れて実行した場合の出力は

和 = 7
14

となる。


アプリケーション (application)

Javaプログラムは、「いくつかのclassファイル」あるいは「複数のclassファイルや関連するリソースをまとめたjarファイル」の形で動作させるが、動作形態としてアプレット(Webブラウザで動作する) とアプリケーションという2形態がある。

アプリケーションは、OS上で独立して動作するプログラムである。コマンドラインやマウスのダブルクリックなどで実行できる。

約束事として、メインとなるクラスの

public static void main(String[ ] args)

というstaticメソッド から実行を開始する。また、

public static void main(String... args)

という書き方もあり、同じ意味となる。

アプレットとアプリケーションのページも参照。


重要なAPI

java.lang
クラス System のメソッド

exit

public static void exit(int status)

現在実行している Java 仮想マシンを終了します。引数はステータスコードとして作用します。通例、ゼロ以外のステータスコードは異常終了を示します。 このメソッドは Runtime クラスの exit メソッドを呼び出します。このメソッドからは戻ってきません。

System.exit(n) の呼び出しの動作は、実際には次の呼び出しと同じです。

Runtime.getRuntime().exit(n)

パラメータ:

status終了のステータス

例外:

SecurityExceptionセキュリティマネージャが存在し、その checkExit メソッドが、指定されたステータスでの終了を許可しない場合

関連項目:

Runtime.exit(int)


java.io
クラス BufferedReader のメソッド

readLine

public String readLine()
           throws IOException

テキスト1行を読み込みます。1行の終端は、改行('\n')・復帰('\r')・復帰+改行のいずれかで認識されます。

戻り値:

入力された1行文字列 (Stringオブジェクト)。ただし行の終端文字は含まれません。 ストリームの終りに達して入力できなかった場合は null。

例外:

IOException入力エラーが発生した場合

java.lang
クラス Integer のメソッド

parseInt

public static int parseInt( String s )
           throws NumberFormatException

パラメータの文字列 s を符号付き10進数の整数型として構文解析し、求められた整数値が返されます。文字列にある文字はすべて10進数でなければなりません。ただし一番目の文字だけは負の値を表すためにマイナス記号のASCII文字 '-' ('\u002d') であってもかまいません。
これは、この文字列パラメータ s と基数 10 が、2つのパラメータをとる parseInt(java.lang.String, int) メソッドにパラメータとして指定された場合と全く同じです。

パラメータ:

s構文解析対象のint値表現を含むString

戻り値:

解析結果のint値

例外:

NumberFormatException文字列がintとして構文解析できない場合

数値と文字列の相互変換のまとめのページも参照。


java.lang
クラス Double のメソッド

parseDouble

public static double parseDouble( String s )
           throws NumberFormatException

Double クラスの valueOf メソッドを実行した場合と同様に、指定された文字列 s を構文解析し、それが表す double 値を返します。

パラメータ:

s構文解析対象のdouble値表現を含むString

戻り値:

解析結果のdouble値

例外:

NumberFormatException文字列がdouble値として構文解析できない場合

導入されたバージョン:

1.2

関連項目:

valueOf(String)

数値と文字列の相互変換のまとめのページも参照。


課題1 : 2つの整数の和・差・積・商・余り

上記「例題1」のソースファイル Rei1.java をコピーし Ex1.java というファイル名に変更し、それに伴ってクラス名も Ex1 と変更する。
その上で、追加修正によって、2つの整数 a, b を入力し、整数の範囲で計算した 和・差 (a - b)・積・商 (a / b)・余り (a % b) を表示するプログラムを作りなさい。

その際、javadocコメントも、課題に合うように、クラスの説明部分に

課題番号 : 課題名

を記入すること。

コンパイル・実行し、以下の各ケースで出力を確かめなさい。

  1. エラーのない入力のとき。a は各自の学籍番号の最後の2桁、b は各自の学籍番号の最後から4桁目、3桁目とする。
    学籍番号が 23CWXYZ のとき、a は YZ、b は WX となる。ただし、YZ が 00 となる人は a を 99 とする。
  2. b に 0 を入れたとき。a は 1 のときと同じ
  3. a に整数でない文字列を入れたとき
  4. b に整数でない文字列を入れたとき。a は 1 のときと同じ

全てのケースで正しく動いたのを確認したら、プログラムのソースファイルおよび1〜4の出力 (数値入力部分も含む) をテキストファイル (拡張子 txt) にまとめる。

授業Webトップページの「課題確認と提出」のところから、提出期限までにまとめたファイルを提出。

多く見られる間違い


演習2 : 円と球の計算問題

以下のような、クラス名 Ex2 のアプリケーション (ソースファイル名 Ex2.java) を作りなさい。

javadocコメントも演習・課題に合うように変更しておくこと。(これは、以降の演習・課題すべてについて適用すること)
例えば、javadocコメントのクラスの説明部分は、今回の演習・課題に合うように、

演習番号 : 演習名

とする必要がある。

半径 r (cm) を入力する旨のメッセージを表示して、キーボードから半径を入力し、

その半径の円の円周(cm)・面積(cm2)、
同じ半径の球の表面積(cm2)・体積(cm3)

をそれぞれ計算し表示するプログラムを作成しなさい。半径は double 型として小数点のついた値も入力できるようにすること。

※ 文字列からdouble値を求めるときは、Integer.parseInt でなく、Double.parseDouble を使う。

入力された半径が 0 以下の値の場合は、エラーを表示し終了すること。

公式を忘れた人は例えばWikipediaの円周率の項目などを参考に。
なお、Java で円周率 π は Math.PI (正確には、java.lang.Math.PI) で指定する。

コンパイル・実行し、以下の各ケースで出力を確かめなさい。
ケース1の半径 9.7 のときには、円の円周は 60.9... 面積は 295.5...、球の表面積は 1182.3... 体積は 3822.9... になることを確認しておくこと。

  1. 半径に 9.7 を入れたとき
  2. 半径に「各自の学籍番号の最後の2桁 ÷ 10」を入れたとき。学籍番号が 23CWXYZ のとき半径は Y.Z となる。ただし、YZ が 00 となる人は 9.9 を、YZ が 97 となる人は 9.8 を、それぞれ入力すること。
  3. 半径にマイナスの値を入れたとき

全てのケースで正しく動いたのを確認したら、プログラムのソースファイルおよび1〜3の出力 (数値入力部分も含む) をテキストファイル (拡張子 txt) にまとめる。

補足説明、注意点

多く見られる間違い

解答例 (演習課題名、クラス名が異なる可能性あり)