カテゴリー
Java

ファイルの入出力について知ろう

この章ではファイルの入出力について学びます。
以下の例は「java.txt」のすべての内容を取り出しています。111 1コンパイルをした後に以下のようにコマンドプロンプトにファイル名を入力して、エンターキーを押すと「java.txt」の内容が出力されます。11
ではファイルからデータを取り出すプログラムの説明をします。1 => FileReaderクラスを使いますので、この1をインポートしてください。

1

次の箇所の説明をします。1 =>入力値が適切かどうかをチェックしています。
「args.length != 1」は配列の数が1でなければ「間違い」が出力されます。
つまり以下のように1つ以上入力があると「間違い」が出力されるという意味です。1
次は以下の箇所の説明をします。
System.exit(0);
=> System.exit()はプログラムが正常に終了することを意味します。
次は以下の箇所の説明をします。1 => FileReaderクラスはファイルからデータを読み込むためのクラスです。
FileReaderクラスはBufferedReaderクラスの引数に入っていますが、BufferedReaderクラスの引数に入れることにより、ファイルの読み込みが早くなります。

次は以下の箇所の説明をします。1 => readLine()はファイルからデータを読み込むためのメソッドです。
BufferedReaderクラスにはどのようなメソッドがあるかはJavaTM Platform Standard Edition 6の中でBufferedReaderを検索しますと以下のメソッドが使えることが分かります。1 つまり、1の箇所はreadLineメソッドで読み込んだものがlnに入って、それとnullを比べています。
readLineメソッドはファイルを最後まで読み終えたら,null という値を返します。
nullは値がない状態を意味します。
ですのでファイルの終端に達していない限り、whileですべてのデータを取り出すことが出来ます。

次は以下の箇所の説明をします。
rd.close();
=>最後に1という形式で閉じます。

次は以下の箇所の説明をします。1 =>JavaTM Platform Standard Edition 6でFileReaderを検索していただくと以下の内容が表示されるのですが、1という箇所を見てください。
これはこのFileReaderクラスがFileNotFoundExceptionという例外を発生させる可能性があることを意味しますので、必ず1を入れてください。1

次はファイルからデータを読み込むメソッドをreadLineメソッドからreadメソッドに変更して出力します。111 では説明を始めます。1 => FileReaderクラスのオブジェクトを作成します。
FileReaderクラスの引数はファイル名になります。

次は以下の箇所の説明をします。1 =>readメソッドはファイルの先頭から1文字を読み込みます。
この例ではwhileで回しているのでファイルの先頭から順番に1文字ずつファイルを読み込みます。
そして、ファイルの終端に達したならば「-1」を返します。
readメソッドはファイルの初めから1文字を読み込みますと言いましたがreadメソッドの戻り値はint型の整数になります。
この整数は文字コードを表す整数ですので、これを1でキャストして「文字」に変換します。
char()」でキャストしないと以下のように整数の連続になり文字にはなりません。1 「char()」でキャストすると以下のように文字になって出力されます。1 次は指定したファイルへの書き込みについて説明します。11 以下の通り、書き込みたいファイルを指定してください。1 ファイルに書き込みをするためにはFileWriterクラスを使用します。
FileWriterクラスの引数はファイル名になります。

1 =>初めに1をインポートします。

1 =>ここではwriteメソッドでファイルへの書き込みを行います。

filew.close();
=>closeメソッドでファイルを閉じます。
FileWriterクラスの例外はIOExceptionですので、これをcatchの引数に入れてください。

次はファイルの削除方法について説明します。1 では説明を始めます。
Fileクラスはファイルやディレクトリの作成などに関するクラスです。1 ファイルを削除するにはFileクラスのdeleteメソッドを使うので引数に削除したいファイルを指定します。
Fileクラスのメソッドはたくさんありますが、以下にその一部を載せます。1 初めにコンパイルしましたら、以下のようにファイル名を入力してください。
入力したファイル名は1に入ります。
その後,if文で1を判定するのですが、deleteメソッドは削除できたらtrueを、削除できなかったらfalseを返します。1

カテゴリー
Java

コマンドライン入力について知ろう

この章ではコマンドライン入力について説明します。
コマンドライン入力とはmainメソッドの引数にデータを与える入力形式です。
では例をみてみましょう。1 例えば、1とコンパイルをした後に以下のような形式で入力してください。1 このように書きますと、1にはabcdが入り、1にはefgが入り、1にはhijが入ります。
それぞれの入力データ間は半角のスペースを入れてください。
for文の条件式はコマンドラインの入力数によりループの数が変わるのでmainの引数にlengthを付けて要素数を得ます。

カテゴリー
Java

キーボードの入力の値を受け取ろう

この章ではキーボードから入力された値を受け取る方法について学習します。
では例をみてみましょう。11 この例はキーボードから整数を入力するプログラムです。
初めに以下のように1をインポートします。
1
次にScannerクラスの引数に1を記述します。
1と書くとキーボードから値を読み込みます。
ここで、画面が入力待ち状態になるので、何らかの値を入力します。
int型の値を読み込むのであれば1のように1という構文で記述します。
入力したあとにリターンキーを押すと入力が完了します。
1の場合はint型の値以外の値を入力するとエラーになりますので気を付けてください。
この例では2回読み込んでいるので、2回入力を行っています。1 入力したもの同士を足しているので、結果は以下のようになります。1 int型以外の型の値を入力したい場合は次のように記述します。11 もう一つ、ユーザーに入力させる方法があります。
この星座を判定するプログラムは学習済みですので、全文は載せませんが見直しておいてください。1 ユーザーに入力してもらうには以下のような形式でBufferedReaderクラスを使います。
BufferedReaderクラスは1行ずつテキストを読み込みます。
スペースの都合で2行で書いていますが、通常は1行で書きます。1 BufferedReaderの引数にはInputStreamReaderクラスを指定します。
InputStreamReaderクラスも文字テキストを読み込むクラスです。
InputStreamReaderクラスの引数に1を指定しているので、キーボードから文字列を読み込みます。
BufferedReaderクラスもテキストを読み込むクラスですがBufferedReaderクラスを使う時にはInputStreamReaderクラスも一緒に使います。
理由はJavaTM Platform, Standard Edition 6で調べると分かりますが、読み込む効率が良くなるのでスピードが速くなります。1 BufferedReaderクラスを使用するためには冒頭で1と入力します。
次の箇所でBufferedReaderクラスのメソッドを使って読み込んだものをweに代入しています。1 1次の箇所は読み込んだものが文字列なので、これをint型の整数値に変換しています。1 JavaTM Platform, Standard Edition 6でBufferedReaderクラスを検索すると次のようにBufferedReaderクラスで使えるメソッド一覧を確認できます。1

カテゴリー
Java

パッケージについて知ろう

この章ではパッケージについて説明します。
パッケージとはJavaにある多くのクラスを用途ごとに分類する仕組みのことです。
JavaTM Platform Standard Edition 6の左端を見ていただくと「パッケージ」という項目には多くのパッケージがあります。
例えば「java.io」というパッケージをクリックしますとそのパッケージに含まれるクラスやインターフェイスが表示されます。
つまり、パッケージとはクラスなどがまとまって入っている箱みたいなものです。
次に例えばその中の1をクリックしますと詳しい説明が表示されます。1 「メソッドを使って星座プログラムを作ろう」の例の先頭で1という記述がありますが、これはjava.ioパッケージをインポートするという意味があります。
つまり、パッケージを使用するには1という記述が必要です。
ですので、星座の例はBufferedReaderクラスを使っているので1という記述を入れています。1 1が付いていますが、これは1に含まれるすべてのインターフェイスやクラスを使用することができると言う意味です。
つまり、以下の1をクリックしたあとに下に表示されるクラスやインターフェイスなどをすべて使用できるという意味です。1 特にクラスを1つしか使わないのであれば1 とクラスを1つだけ指定して書いて頂いても結構です。
先ほど説明したパッケージはjavaで初めから作られているものですが、自身で作ったクラスファイルもパッケージにすることができます。
ある目的を持ったクラスやインターフェイスを同じパッケージにすることで「どこに何のクラス」があるかもわかりやすくなります。
パッケージの基本構文は以下の通りです。1 では例を見てみましょう。
111 FiveInARowクラスにはgameAというパッケージ名を付けて、GridクラスにはgameBというパッケージ名を付けました。
次にこのパッケージ用のフォルダをパッケージ名で作成します。
今までは1にファイルを置いていましたが、1の下に以下のようにフォルダを作成します。1 「C:¥java¥gameA」にはFiveInARowクラスを入れ、1にはGridクラスを入れます。
これで2つのパッケージが出来ましたが、FiveInARowクラスの中でGridクラスを使いたい場合には
FiveInARowクラスに1もしくは1と言う形式で1のように書きます。11 次に以下のように1という形式でそれぞれのファイルのコンパイルを行います。1 11class Gridからpublicを外すとパッケージ内のクラスからのみGridクラスにアクセスすることができるので、以下のように他のクラス内のmainメソッドの中でGridクラスのオブジェクトを作成することが出来なくなります。1

カテゴリー
Java

例外処理について知ろう

この章では例外処理について説明します。
例外処理については少し説明しましたが、例えば数字を入れなくてはいけない場面で数字以外のものが入れられたら、「数字の入力が必須です」と例外処理が実行されます。
説明済みの星座のプログラムを見てみましょう。1111111結果は以下の通りです。1 例えばこのプログラムで数字以外のaなどを入力すると「数字入力」と出力されます。
コマンドプロンプトで入力する場合には例え3などと入力しても文字列を入力していることになるので、これを1で整数に変換するわけですが、この時、aなどのように数値に変換できない文字列形式の場合には例外が発生します。
例外が発生するとcatch以降のブロックに実行が移ります。1 例外が発生する状況はこの数字以外以下のようなケースが考えられます。
〇例えば配列の要素数を5つで宣言したにも関わらず6つ目にデータを入れようとしたとき
〇ファイルを開くときにそのファイル自体が見つからなかったとき
〇 0で割り算をしたとき
〇メモリを消費しすぎて、足らなくなったとき
では配列の例外の例を見てみましょう。11 この例は配列の要素数を3つで宣言しているのにそれを超えた添え字にデータを入れようとしたので例外が発生します。
例外の流れはブロックの中で例外が発生するとcatchのブロックに処理が移ります。
発生した例外が catchの引数の例外クラスと一致していた場合、catchブロック内に処理が移ります。
しかし例外が発生したとしてもcatchの中の1という例外に一致したものでないと例外処理が行われません。
一致したのならばcatchの中のeに例外の内容が入ります。
1は例外処理を行うクラスになります。
JavaTM Platform Standard Edition 6 APIを見ますと配列のサイズを超えた場合にその例外をスローしてくれるクラスと書いてあります。
JavaTM Platform Standard Edition 6 APIはとても便利なので分からないことがありましたら参考にしてください。
どんなに経験のあるプログラマでもすべてのクラスを把握するのは不可能なので、このJavaTM Platform Standard Edition 6 APIは手放すことはできません。1 例外が成功したのならば1 と正常に例外をキャッチ出来ていることが分かります。
このように例外処理を行うことでプログラムが途中で終わってしまうことを防ぐことが出来ます。
以下の例では例外を使っていませんので、途中で強制終了させられます。1 出力結果は以下の通りです。1 もちろん、すべての配列の箇所で例外処理を行っていては例外処理だらけになってしまうので、例外が発生しそうな箇所だけ例外処理を施すのがいいでしょう。
では他の例外クラスの説明をします。
星座の例のNumberFormatExceptionはNumberFormatExceptionというクラスであり、文字列を整数に変換するときに、aなどのように数値に変換できない文字列の形式の場合に例外が発生します。1
次はIOExceptionクラスについて説明します。
IOExceptionクラスはコマンドライン入力やファイル入力などの入出力の時に発生する例外に対して例外処理を行うクラスです。
先ほどのSeizaクラスの中にBufferedReaderクラスがありますが、このクラスはIOExceptionの例外を発生する可能性がありますので、必ず例外処理でキャッチする記述をしないといけません。1 例外処理をしないと以下のエラーが表示されます。1
では次の例に進みます。11 ArithmeticExceptionクラスは0で割ろうとしたときに発生する例外です。1 結果は次の通りです。1 では次の例に進みます。11 Exceptionクラスはすべての例外クラスの親クラスになります。
ですので、例えばArithmeticExceptionクラスが行っている例外処理も上の例のようにExceptionクラスで代用することが出来ます。

次はメソッドの中で例外が発生した時の例外処理の方法について説明します。11 tryのブロックの中でhairetsuメソッドを呼んでいます。
もしhairetsuメソッドの中で例外が発生する可能性があるのならば例のようにメソッド名の右横に1を付け加えます(この例ではスペースの都合で2行に分けて書いています)。
この例の場合には配列の要素数を超えた添え字にデータを入れようとしているので例外が発生します。
例外が発生したのならばmainメソッドに戻って例外処理を行います。
結果は以下のようになります。1

カテゴリー
Java

インターフェイスについて知ろう

この章ではインターフェイスについて説明します。
インターフェイスは抽象クラスと使い方がほとんど同じなのですが、インターフェイスもメソッドの宣言だけをして、メソッドの中身は受け継いだクラスで実装します。 
実装とは機能を加えていく作業のことを言います。
抽象クラスは中身のある普通のメソッドも書けましたが、インターフェイスは中身のあるメソッドを一切書くことは出来ません。1 実装ではインターフェイスの中で宣言をしたメソッドの中身を書いていきます。
インターフェイスではメソッドの中身を書くことが出来ません。
つまり、すべてが抽象メソッドになりますが、1 などとabstractは付ける必要はありません。
また、インターフェイスの中には定数を書くことが出来ます。
定数とは書き替えることが出来ないデータのことを言います。
例えば次の例で説明する1は一見普通のフィールド変数のように見えますが、これは1が省略されています。
つまり、「班を分けるプログラムを作ろう」で説明した通りfinal装飾子を付けた変数は改めてデータを入れることが出来なくなります。
ではインターフェイスの例を見てみましょう。
これらの3つのプログラムはそれぞれ別のファイルに保存します。
この例のインターフェイスはSoldier1です。
sleepメソッド、eatメソッド、runメソッド、attackメソッドをインターフェイスで宣言していますが、実装はSpiderMan1クラスで行っています。
以下の例は「Soldier1.java」です。
1
以下の例は「SpiderMan1.java」です。
スペースの都合でインターフェイス名を2行目に書いています。111 以下の例は「Main9.java」です。1 Soldier1でsleepメソッド、eatメソッド、runメソッド、attackメソッドで中身のないメソッドを定義したので、必ずSpiderMan1クラスで実装しなくてはいけません。
結果は以下の通りです。1

カテゴリー
Java

クラスについての雑学を知ろう

「標準クラスについて知ろう」の章で「標準クラス」のMathクラスについて説明しましたが、このクラスはjavaの内部機能として初めから装備されているクラスです。
MathクラスのメソッドもMathクラスで機能が装備されているから、使用できるわけです。
JavaTM Platform Standard Edition 6 APIにはすべての標準クラスのメソッドやフィールドについての詳細が掲載されています。
以下のURLがJavaTM Platform Standard Edition 6 APIのサイトです。1 クラスを検索するには初めにCtrlを押しながらFキーを押します。
そうすると検索窓が現れますので、ここに例えばMathと入れると左端にヒットした部分だけ色が変わるので、ここをクリックすると具体的な説明を見ることが出来ます。11 例えばMath.randomについては学習済みですが、このメソッドの使い方が分からなければJavaTM Platform Standard Edition 6 APIで検索をすると以下の通りに説明が書いてあります。1 このMathクラスにはrandomメソッド以外にもたくさんのメソッドがありますので、調べてみてください。
どんなにJavaに精通したプログラマでもすべてのメソッドを覚えているわけではないので、分からない時にはこのサイトを参考にしています。

次はObjectクラスについて説明します。
Objectクラスはすべてのクラスの親クラスになりますので、他のクラスは自由にObjectクラスのメソッドなどを使用することが出来ます。
toStringメソッドについては説明しましたが、これはObjectクラスのメソッドになりますので、すべてのクラスで使用することができます。
JavaTM Platform Standard Edition 6 API で toStringメソッドを調べると以下のような説明を探すことが出来ます。1 Objectクラスは以下のようなメソッドを使うことが出来ますので、JavaTM Platform, Standard Edition 6 APIの中で「Object」と検索をして参考にしてください。1

カテゴリー
Java

標準クラスについて知ろう

この章では標準クラスについて説明します。
先ほどはクラスの作成方法を説明しましたが、JavaにはMathクラスのように初めから機能が準備されているクラスが複数あります。
これを標準クラスと言います。
例えばMathクラスには平方根を計算するメソッドや四捨五入するメソッドなどがあります。
Mathクラスのメソッドから説明をします。
maxメソッドの例をみてみましょう。1 結果は「20」です。
2つの値の中で大きいほうを出力してくれるのがMath.max()です。1 maxメソッドの中に引数1と引数2をカンマを挟んで入れると2つの値の内どちらの値が大きいかを判断してくれます。
maxメソッドを実行した結果を戻り値と言いますが、この例ではmax1変数でこの戻り値を受け取っています。
そして、比較する2つの値と戻り値を入れる変数は同じ型である必要があります。
1を例に取ると引数はint型で、戻り値を入れる型もint型になります。

次はminメソッドについて説明します。1 2つの値の中で小さい方の値を戻り値として返してくれるのがMath.min()です。1 minメソッドの中に引数1と引数2をカンマを挟んで入れると2つの値の内どちらの値が小さいかを判断してくれます。
結果は「10」です。

次はroundメソッドについて説明します。1 roundメソッドは指定した値を四捨五入するメソッドです。1 四捨五入したいfloatやdoubleの値を引数に指定します。
round(float a) ;の戻り値はint型の変数に入れて、
round(double a);の戻り値はlong型の変数に入れます。
結果は「3」になります。

次はrandomメソッドについて説明します。1 10.0以上1.0未満のランダムな値を戻り値で返します。
randomメソッドに引数はありません。
結果はその時の出力により毎回違います。
例えば0.6973262509409655のように出力されます。
この値を整数で受け取りたい場合には1 のように1でキャストして戻り値もintで受け取ります。
10を掛けた場合には0から9までの乱数を得ることができます。

次はsqrtメソッドについて説明します。11 指定された値の平方根を戻り値で返します。
結果は1.7888543819998317になります。
次はStringクラスについて説明します。これも標準クラスの1つです。
普段は文字列を作成するときに1と書いていますが、これを書き換えると1となります。
Stringは今までintと同じように使ってきましたが、実はクラスになります。
Stringクラスは多用するので、1などと書くのは面倒なので、1のように簡潔に書けるような仕様になっています。
Stringクラスなど標準クラスの詳細を知りたい場合はJavaTM Platform Standard Edition 6 APIというサイトで調べます。
JavaTM Platform Standard Edition 6 APIの使い方は「クラスについての雑学を知ろう」で説明します。
Stringクラスのメソッドには説明済みのlengthやisEmptyなどたくさんのメソッドがあります。1

カテゴリー
Java

抽象クラスについて知ろう

この章では抽象クラスについて説明します。
抽象クラスとは親クラスには大まかなことだけを定義しておいて、具体的なことは継承した各クラス内で決めると言う仕組みの事です。
抽象クラスは親クラスの宣言に1が付いたクラスであり、抽象クラスの中のメソッドには名前だけ決めて、中身は何も書きません。そして、メソッドの内容は抽象クラスを継承したクラスに書きます。このようなメソッドを抽象メソッドといいます。
抽象メソッドは先頭にabstractと書きます。1 次の例ではクラスは4つありますが、それぞれ別ファイルに保存してください。
次のファイルは「Soldier.java」です。1 次のファイルは「Superman.java」です。
11 次のファイルは「SpiderMan.java」です。11 次のファイルは「Main6.java」です。11 この例ではSoldierクラスが抽象クラスになります。1 抽象クラスを宣言した後は以下のようにabstractを付けて抽象メソッドを宣言しますが、抽象メソッドは中身を書きません。1 また、抽象クラスには普通のメソッドも記述出来ます。
つまり、抽象メソッドでないメソッドも書くことができます。
抽象メソッドでない普通のメソッドは継承するクラスにも共通のメソッドであり、わざわざクラスごとに内容を変える必要が無い場合には普通のメソッドにしてください。
この例では寝ると言うsleepメソッドを抽象メソッドにしないで、普通のメソッドにしています。
抽象メソッドは例えばeatメソッドではSoldierごとに食べるものが違うので、eatと言う名前だけ決めて、後の具体的な内容は抽象クラスを継承したクラスのeatメソッドに任せるという形を取ります。
つまり、抽象クラスを作った時点では具体的なメソッドの中身を決める必要が無いわけです。
runやeatなど必要な機能だけを抽象クラスでは決めることになります。
抽象クラスを継承したクラスは、この抽象メソッドを必ずオーバーライドしなければなりません。
オーバーライドしないとコンパイルエラーとなります。
ですので1 のように抽象メソッドの宣言をしたのならば次のように抽象クラスを継承したクラス内で実際の具体的な内容を記述してください。111 つまり以下のように書くとエラーになります。1 結果は以下の通りです。1

カテゴリー
Java

staticについて知ろう

この章ではstaticについて説明します。
staticが指定してあるフィールド変数を静的フィールドと言います。
次の例では以下のlastIDが静的フィールドです。1 静的フィールドの特徴は今までのフィールド変数はオブジェクトを作成してから使ってきましたが、静的フィールドはオブジェクトを作成しなくても使うことが出来ます。
つまり、静的フィールドはオブジェクトではなくてクラスに属していると言えます。
では例をみてみましょう。
次の例は「Main88.java」です。11 次の例は「Member22.java」です。111111111 結果は以下の通りです。1 Main88クラスでは3つのオブジェクトを作成していますが、上記の会員番号が更新されていることに気付くと思います。
試しに1の中のstaticを外してみますと次の結果のようにカウントがされません。1 つまり、staticを付けないフィールド変数はオブジェクトに属しているので3個オブジェクトを作成してもその都度その変数の値は上書きされてしまうわけです。
逆にstaticを付けたフィールド変数はクラスに属しているので上書きされずにカウントアップされたわけです。
つまり、オブジェクトに依存していない変数と言えます。
ではカウントアップするメソッドについて説明します。
仕組みはコンストラクタが呼び出されるごとに以下のmakeMemberIDメソッドが呼び出され、静的フィールドのlastIDをカウントアップするという手法です。1 以下の箇所で静的フィールドをカウントアップしています。1 結果を出力するのは以下の箇所です。1 「クラスについて知ろう」で説明した通りmember1, member2, member3の後ろにはtoStringメソッドが省略されています。1 次に静的フィールドを直接出力する方法について説明します。
静的フィールドはクラスに属していると言いましたが、この静的フィールドに直接アクセスするには1と、記述します。
では説明をするのに先ほどの例を変更して使いますのでMember22.javaの1 の箇所を1に変更します。
そして、Main88.javaの中に次の赤枠の記述を追加します。1 上の赤枠の箇所を出力すると以下の通り「合計人数は3」になります。11 mainメソッドは1つもオブジェクトが存在しない状態で呼び出されているので、staticが付いています。
つまり、静的メソッドはクラスに属するメソッドなので、オブジェクトに依存していません。