パソコンデスクトップ用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 クラスのオブジェクト) では、下記メソッドが多く使用される。
各種のパラメータを文字列として出力する。
各種のパラメータを文字列として出力し、最後に改行を一つ付加出力する。
パラメータのない println メソッドは改行一個のみを出力する。
パラメータとして書式文字列を受け取り、その書式に沿って後続パラメータ等を出力する。
書式文字列はC言語の printf 関数のものと類似している。書式文字列中では、改行は \n でなく %n という指定になる。
Javaでは、通常の処理の流れに沿わない特別な事項が発生したときに 例外 (exception) を発生させ (「例外を投げる」と言う)、その例外を指定された例外処理コードで受け取り処理する。
例外は下記の2つに大きく分かれる。
例外処理を記述するには、try 〜 catch 〜 finally 文 を使う。
try { // 通常の処理 // ここで発生した例外を下の catch によって捕えることができる } catch (例外クラス名 捕捉用変数) { // 捕捉した例外の処理 } finally { // 例外が発生してもしなくても最後に実行される処理 }
複数の例外を捕捉したい場合は複数の catch を記述する。上から順に見て、例外の型が最初に一致した catch の処理が実行される。
捕捉する例外がない場合は catch を書かなくてもよい。最後に実行させたい処理がない場合は finally を書かなくてもよい。
発生した例外は、対応する catch がない場合はさらに上のレベルの呼び出し元メソッドに伝播していく。
一番上のレベル (アプリケーションの場合、主クラスのmainメソッド) でも処理されない例外があると、例外発生の内容を表示してプログラムが異常終了する。
//
は、そのカラム位置以降の行テキストをコメントにする。
行の全体、あるいは、行のある箇所以降右側部分をコメントとするときに使用する。
/*
で始まり
*/
で終わる区間はコメントとなる。複数行に渡るコメントでもよいし、1行内のごく狭い範囲のコメントでもよい。
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プログラムのごく簡単な例を示し、また、その応用として演習問題をやってもらう。
最初は、動作するプログラム全体を示す。
入力・コンパイル・実行の方法については、
を参考にすること。
例題1:
2つの整数 a, b を入力し、和・差 (a - b) を表示するプログラム。整数 b は 0 でないとし、0 が入力されたらエラーを表示し終了する。
※ javadoc によるドキュメント生成
以下のコマンドで、HTML文書形式のドキュメントが作成できる。
javadoc -package -author Rei1.java
データ型のページも参照。
種類 | 型名 | ビット数 | 内容・範囲 |
---|---|---|---|
整数型 | byte | 8 | -128 から 127 |
short | 16 | -32768 から 32767 | |
int | 32 | -2147483648 から 2147483647 | |
long | 64 | -9223372036854775808 から 9223372036854775807 | |
浮動小数点型 | float | 32 | IEEE規格。単精度 |
double | 64 | IEEE規格。倍精度 | |
論理型 | boolean | 1 | true (真) または false (偽) |
文字型 | char | 16 | Unicode (UTF-16) で表される文字。'\u0000' (= 0) から '\uffff' (= 65535) |
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
となる。
Javaプログラムは、「いくつかのclassファイル」あるいは「複数のclassファイルや関連するリソースをまとめたjarファイル」の形で動作させるが、動作形態としてアプレット(Webブラウザで動作する) とアプリケーションという2形態がある。
アプリケーションは、OS上で独立して動作するプログラムである。コマンドラインやマウスのダブルクリックなどで実行できる。
約束事として、メインとなるクラスの
というstaticメソッド から実行を開始する。また、
という書き方もあり、同じ意味となる。
アプレットとアプリケーションのページも参照。
現在実行している Java 仮想マシンを終了します。引数はステータスコードとして作用します。通例、ゼロ以外のステータスコードは異常終了を示します。 このメソッドは Runtime クラスの exit メソッドを呼び出します。このメソッドからは戻ってきません。
System.exit(n) の呼び出しの動作は、実際には次の呼び出しと同じです。
status | 終了のステータス |
SecurityException | セキュリティマネージャが存在し、その checkExit メソッドが、指定されたステータスでの終了を許可しない場合 |
Runtime.exit(int)
テキスト1行を読み込みます。1行の終端は、改行('\n')・復帰('\r')・復帰+改行のいずれかで認識されます。
入力された1行文字列 (Stringオブジェクト)。ただし行の終端文字は含まれません。 ストリームの終りに達して入力できなかった場合は null。
IOException | 入力エラーが発生した場合 |
パラメータの文字列 s を符号付き10進数の整数型として構文解析し、求められた整数値が返されます。文字列にある文字はすべて10進数でなければなりません。ただし一番目の文字だけは負の値を表すためにマイナス記号のASCII文字 '-' ('\u002d') であってもかまいません。
これは、この文字列パラメータ s と基数 10 が、2つのパラメータをとる parseInt(java.lang.String, int) メソッドにパラメータとして指定された場合と全く同じです。
s | 構文解析対象のint値表現を含むString |
解析結果のint値
NumberFormatException | 文字列がintとして構文解析できない場合 |
数値と文字列の相互変換のまとめのページも参照。
Double クラスの valueOf メソッドを実行した場合と同様に、指定された文字列 s を構文解析し、それが表す double 値を返します。
s | 構文解析対象のdouble値表現を含むString |
解析結果のdouble値
NumberFormatException | 文字列がdouble値として構文解析できない場合 |
1.2
valueOf(String)
数値と文字列の相互変換のまとめのページも参照。
上記「例題1」のソースファイル Rei1.java をコピーし Ex1.java というファイル名に変更し、それに伴ってクラス名も Ex1 と変更する。
その上で、追加修正によって、2つの整数 a, b を入力し、整数の範囲で計算した 和・差 (a - b)・積・商 (a / b)・余り (a % b) を表示するプログラムを作りなさい。
その際、javadocコメントも、課題に合うように、クラスの説明部分に
を記入すること。
コンパイル・実行し、以下の各ケースで出力を確かめなさい。
全てのケースで正しく動いたのを確認したら、プログラムのソースファイルおよび1〜4の出力 (数値入力部分も含む) をテキストファイル (拡張子 txt) にまとめる。
授業Webトップページの「課題確認と提出」のところから、提出期限までにまとめたファイルを提出。
以下のような、クラス名 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〜3の出力 (数値入力部分も含む) をテキストファイル (拡張子 txt) にまとめる。
r
の2乗、3乗は r * r
、r * r * r
で求められる。別法として、Math.pow メソッドを使ってもよい。解答例 (演習課題名、クラス名が異なる可能性あり)