Back To Main


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ ◆Javaで珈琲ブレイク vol.005◆
┃……………………………………………………………………………………………
┃ [不定期] まぐまぐ ID=0000088576 Melma! ID=m00061296
┃……………………………………………………………………………………………
┃ 今回からご覧になる方は、バックナンバーもご活用下さい
┃ http://www.melma.com/mag/96/m00061296/
┃ http://backno.mag2.com/reader/Back?id=0000088576
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


皆さん、こんにちは。

Mr.Hackです。

前回のvol.004でふれたtoString()メソッドの使い方については、紙面がなくなってしまったので、平日にに改めて別途メルマガをお送りします。今回もボリュームたっぷりです。今回はそこに、『Javaスタイル職人への道』も記載させて頂きました。このJava職人も結構な行数なんです。メルマガで一回に送れる字数が限られていますので、こんな形になってしまったことをご了承下さい。

ある読者の方から掲示板にメッセージをいただいたのですが、『大変勉強になり楽しく読ましてもらっています。』という言葉は、とてもうれしいです。一人でもそういって頂ける方がいらっしゃるというのは、とてもやりがいになりますね。これからも引き続きがんばっていこうと思います。

それから、前回、「doubleという裸では相手にしてくれないのです。」といったことについて腑に落ちなかった方は、掲示板にコメントを書きましたので、そちらをご覧下さい。もう一つ。rt.jarのお話ですが、Zip解凍ソフトで開けるように、rt.jarをrt.zipと変えた方は、ちゃんとrt.jarに戻しておいてくださいね。戻しておかないと、次回CPad等でコンパイルするときに、

Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object

なるエラーがでます。もうすでにエラーがでて悩んでる方は、rt.zipをrt.jarに戻すことで解決できます。

さて、今回は、Homeworkの解答のまえに、ConvertToCelsius1.javaのプログラムをコンパイル・実行し、実際にエラーを出してみましょう。このプログラムを実行して、”華氏(Fahrenheit)を入力せよ” と入力を促されたときに何も入れずEnterキーを押してみましょう。どうですか?

===============================================================
--- 華氏から摂氏への変換プログラム 1 ---
===============================================================
華氏(Fahrenheit)を入力せよ :
Exception in thread "main" java.lang.NumberFormatException: empty String
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:9
89)
at java.lang.Double.parseDouble(Double.java:184)
at ConvertToCelsius1.main(ConvertToCelsius1.java:45)
-- Press any key to exit (Input "c" to continue) --

と、訳のわからないものがでてきましたね。このプログラムはいったいどうなってしまったのでしょう?

例外の一行目に、

Exception in thread "main" java.lang.NumberFormatException: empty String

とありますね。これは、例外(Exception)がメインスレッドの中で発生しましたということです。それも、ナンバーフォーマットの例外(NumberFormatException)で 空文字列(empty String)だと。そして、その下をみていくと、一番したの行に、

at ConvertToCelsius1.main(ConvertToCelsius1.java:45)

とでています。ここがあやしいですね。

2行目と3行目を見てください。

at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:989)
at java.lang.Double.parseDouble(Double.java:184)

のカッコのなかに、例外が発生したクラスとその行番号が出てきています。どうやってクラスだとわかるの?クラス名は大文字で始まりましたね。これがクラス発見の手がかりです。それでは、2行目と3行目は何故あやしくないの?それは、FloatingDecimalクラスも、DoubleクラスもすでにパッケージとしてSun Microsystemsから供給されているからです。あなたよりも何十年も先輩の超優秀プログラマが設計したパッケージです。そこのエラーを疑う前に自分のプログラムがおかしいと疑った方が筋が通っていますね。それで、最後の行があやしいと疑ったのです。

最後の行のカッコの中は、ConvertToCelsius1クラスとあり、行番号として、45とあります。45行目ってどこ?CPadの醍醐味を味わいましょう。編集画面の左側はどうなっています?そう!行番号が書かれているじゃないですか。おぉーーー!すごいでしょ。CPad。その45行目はどうなっていましたっけ?

double doubleFahrenheit = Double.parseDouble(fahrenheit);

おお。ここがあやしい。例外発生メッセージの一つ上に戻ると、

at java.lang.Double.parseDouble(Double.java:184)

となっていますね。お!これは、Double.parseDouble()メソッドを使ったときになにか異変が起きたんだ・・・。いい線行ってますね。どうなったんでしょう?他に手がかりは?困ったときは、どうするんでしたっけ?


GO TO "API"です。


Doubleクラスに行ってください(未だにDoubleクラスにたどり着けない方は、vol.003を参照)。そこのメソッド概要の中のparseDouble()メソッドはどうなってます?あやしいことは、何も書いていない?よーくみてください。

------------------------------------------------------------------------
parseDouble(String s)
Double クラスの valueOf メソッドを実行した場合と同様 に、指定された String が表す値に初期化された新しい double 値 を返します。
------------------------------------------------------------------------

ほら、parseDouble(String s)にリンクが張ってあるじゃないですか?クリックしました?

------------------------------------------------------------------------
例外:
NumberFormatException - 文字列が解析可能な double 値を含まない場合
------------------------------------------------------------------------

お。疑わしき、NumberFormatExceptionがでてきましたね。つまり、double値である値、例えば、72、72.5を含まない場合が文字列として入力されると、NumberFormatExceptionという例外が起きる、ということが書かれています。

まさにそれですね。何も入れないでEnterキーを押すということは、まさに、double値でない値を入力したのですね。

さて、どうしたら、この例外を防ぐことができるのでしょう?

ここで、前回のHomeworkの解答です。

■前回の解答
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Question 4 の答え

【ConvertToCelsius1_1.java】
━━━━━━━━━━━━ ここから ━━━━━━━━━━━━━━━━━━
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

/**
* 華氏・摂氏変換プログラム1_1 try and catch構文
* ユーザーが入力した華氏を摂氏に変換する
*
* @author Mr.Hack
*/
public class ConvertToCelsius1_1 {

/**
* 華氏(Fahrenheit)から摂氏(Celsius)への変換
*
* @param fahrenheit 華氏
* @return celsius 摂氏
*/
static double convertToCelsius(double fahrenheit) {
double celsius = (fahrenheit - 32) * 5 / 9;
return celsius;
}

/**
* ユーザーに入力を促し、華氏を入力後、摂氏を計算し画面に表示する。parseDoubleで
* 例外が発生したときは、例外メッセージを表示しプログラムを終了する。
*
* @param args コマンドライン引数
* @exception IOException 入力値がdouble値ではない場合、例外発生
*/
public static void main(String[] args) throws IOException {

double doubleFahrenheit = 0.0;
double celsius = 0.0;

System.out.println("===============================================================");
System.out.println(" --- 華氏から摂氏への変換プログラム 1 --- ");
System.out.println("===============================================================");

System.out.print("華氏(Fahrenheit)を入力せよ : ");

// バイトストリーム
InputStream myStream = System.in;
// キャラクタストリーム
InputStreamReader myStreamReader = new InputStreamReader(myStream);
// バッファーとして蓄える
BufferedReader myBufferedReader = new BufferedReader(myStreamReader);
// readLine()メソッドで行単位ごとに読む
String fahrenheit = myBufferedReader.readLine();
//input streamを閉じる
myBufferedReader.close();
try {
//String型fahrenheitをdouble型へ変換
doubleFahrenheit = Double.parseDouble(fahrenheit);
}
// 例外が発生したときのみcatch構文が実行される
catch (Exception e) {
System.out.println("不正な値を入力したため、計算結果を表示せずに、プログラムを終了します");
return;
}
// double型の華氏をconvertToCelsius()メソッドで摂氏に変換
celsius = convertToCelsius(doubleFahrenheit);
System.out.println("あなたが入力した" + fahrenheit + "Fは、摂氏で" + celsius + "Cです");
}
}
━━━━━━━━━━━━ ここまで ━━━━━━━━━━━━━━━━━━

おっと!ここで、importに*(スター)を使った方。禁止ですよー。禁止(理由はvol.004参照)。Readability向上のために、スターは使わないようにしましょう。クラスがどこか分からないときは、APIで検索して確かめてくださいね。


■例外処理(Exception Handling)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

さて、今回は、例外処理(Exception Handling)がテーマです。例外処理とは、不正な入力がされた場合は、予期しないことが起こった場合等に、
try、catch文を使って例外(Exception)を発生(throw)させます。throw(スロー)したり、catch(キャッチ)したりとなんか、キャッチボールみたいですね。そうなんです。例外(Exception)のキャッチボールなのです。予期しないことが起こったときに、Exceptionをthrow(発生、投げる)させ、それを、catchする(受け取る)のです。構文はこんな感じです。

try {
文の例外をチェック
}
catch (Exception e) {
例外をキャッチ、または、キャッチしたものをまた投げる(throw)
}
finally {
例外が発生使用としまいと必ず処理する文
}

finally構文のなかには例外が発生使用としまいと必ず処理したい文を書きます。
上記のプログラムの例では、Double.parseDouble()メソッドが、空文字や、double型の数値に変換できないもの(たとえば、アルファベットであるMr.Hack)がパラメータとして渡された場合、こりゃー、変換できねーよ!と例外(Exception)を投げて警告します。投げられた例外はどこかでキャッチしてあげなければなりません。キャッチして警告である例外をprintln()メソッドでconsoleにプリントアウトしたり、お!例外がでたから、次のプロセスは実行するのやーめよっと、ロジックを変更したりします。それをするのが、catch構文です。上記のプログラムの例では、例外が発生したときに、ユーザーに何か異変が発生したと知らせるために、System.out.println()メソッドをつかって、

不正な値を入力したため、計算結果を表示せずに、プログラムを終了します

とconsoleにアウトプットしました。そして、return文でプログラムを終了させました。そのため、以下の

celsius = convertToCelsius(doubleFahrenheit);
System.out.println("あなたが入力した" + fahrenheit + "Fは、摂氏で" + celsius + "Cです");

は実行されずに終わったのです。ちなみに、catch節のカッコの中にあるExceptionは大文字で始まっているので、クラスですね。その横のeはなんですか?Exceptionクラスの参照変数ですね。catch節はメソッドではありませんが、あたかもメソッドのパラメータであるかのように、Exceptionクラスの参照変数eは発生した例外のオブジェクトを指しているのです。

try catch構文で例外をキャッチしてあげないとどうなるのでしょう?

誰も投げられた例外をキャッチしてくれないと、最後に伝家の宝刀である、Javaインタープリタ(interpreter)君が、誰もキャッチしなかったね。代わりに僕がキャッチしたよ、と例外をプリントアウトしてくれます。それが、あの空文字でEnterしたときの訳の分からないメッセージです。つまり誰かが投げた例外をちゃんとどこかでキャッチしてあげれば、あのメッセージは出てこないのです。例外処理はキャッチボールです。投げる人がいれば、受け取る人がいます。受け取る人がいなければ、ボール(例外)はどんどん転がっていきます。

ところで、あれ?Doubleクラスのメソッド、parseDouble()が投げる例外ってExceptionクラスのインスタンスだったっけ?

いいところに気がつきましたね。もう一度、APIにいって、DoubleクラスのparseDoubleメソッドを見てみましょう。

------------------------------------------------------------------------
例外:
NumberFormatException - 文字列が解析可能な double 値を含まない場合
------------------------------------------------------------------------

あれあれ?NumberFormatExceptionってなってますね。しかしながら、Exceptionでもうまく例外がキャッチできました。一体全体どうなっているのでしょう?Exceptionクラスってジョーカーのようなワイルドカードなのでしょうか???

いい線です。ExceptionクラスのAPIに行ってください。

java.lang.Object
|
+--java.lang.Throwable
|
+--java.lang.Exception

もうおなじみですね。この形。そうです、継承(Inheritance)を表しています。継承の概念は、前回お話したように、後でじっくりと勉強しますが、簡単に言えば、祖先の性質を引き継いでいるということでしたね。このExceptionクラスのページを少し下にスクロールしてください。そうすると、

直系の既知のサブクラス:
AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException, BadLocationException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, ExpandVetoException, FontFormatException, GeneralSecurityException, IllegalAccessException, InstantiationException, InterruptedException, IntrospectionException, InvalidMidiDataException, InvocationTargetException, IOException, LastOwnerException, LineUnavailableException, MidiUnavailableException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NoSuchFieldException, NoSuchMethodException, NotBoundException, NotOwnerException, ParseException, PrinterException, PrivilegedActionException, PropertyVetoException, RemarshalException, RuntimeException, ServerNotActiveException, SQLException, TooManyListenersException, UnsupportedAudioFileException, UnsupportedFlavorException, UnsupportedLookAndFeelException, UserException

とあります。なんかたくさんあますね。これは、

直系の既知のサブクラス:

とあるので、これらのクラスは、親であるExceptionの性質を引き継いでいますね。そのたくさんある中に、有名な、IOExceptionやRuntimeExceptionなんてクラスもありますね。

このページを開いたついでに、階段状の継承を表している関係図から、Exceptionの親に当たるThrowableをクリックしてみましょう。クリックしましたか?そこの一番最初にはなんて書いてありますか?

------------------------------------------------------------------------
Throwable クラスは、Java 言語のすべてのエラーと例外のスーパークラスです。
------------------------------------------------------------------------

よく見てください。『すべての』エラーと例外のスーパークラスとなっています。まさに、例外の起源がここにあるのです。

え、それじゃー、それじゃー、さっきのプログラムでNumberFormatExceptionをキャッチするのにThrowableも使えるの?

使えます。Exceptionの代わりに、Throwableとしてコンパイル・実行してみてください。


try {
doubleFahrenheit = Double.parseDouble(fahrenheit);
}
catch (Throwable e) {
System.out.println("不正な値を入力したため、計算結果を表示せずに、
プログラムを終了します");
return;
}

ね。うまくいったでしょ。

ところで、NumberFormatExceptionってどこにあるの?Exceptionクラスの直系の既知のサブクラスのリストの中になかったようだけど?

APIの左下ウィンドウで、でNumberFormatExceptionを検索してクリックしてみると、

java.lang.Object
|
+--java.lang.Throwable
|
+--java.lang.Exception
|
+--java.lang.RuntimeException
|
+--java.lang.IllegalArgumentException
|
+--java.lang.NumberFormatException


となっていますね。Throwable、Exceptionからずーと下位にありますね。でも、まさしく、Throwable、Exceptionクラスのサブクラスにあります。先ほどの経験則からいくと、NumberFormatExceptionのインスタンスは、Exceptionでも、その上位クラスのThrowableでもキャッチ(catch)できる、いうことになりますね。つまり、上位クラスは下位クラスのインスタンスが投げられても、キャッチできるということになります。もっと詳しくいえば、上位クラスの参照変数は(catch節のパラメータ)は下位クラスのインスタンスをcatch節で参照できるということです。

逆はどうでしょう?

Exceptionのインスタンスとして投げられたものは、NumberFormatExceptionではキャッチできません。それは、スーパークラスで初期化されたインスタンス(たとえば、Exceptionのインスタンス)はそのサブクラスである参照変数(例えば、catch節でのパラメーターとしてのNumberFormatExceptionの参照変数)では参照できないからです。実際のキャッチボールでたとえれば、上位のExceptionという大きなボールを下位の小さなミットではキャッチ仕切れないのです。クラスが同じであるインスタンスならボールの大きさも、ミットの大きさも同じなので、うまくキャッチできますね。

ところで、こんな疑問を感じた方はいらっしゃいますか?もし、Javaインタープリタが例外をプリントアウトすることが、伝家の宝刀(希なケース)である場合、なぜ、コンパイラーは例外が発生するから、キャッチせよ、ということをプログラマに事前に教えてくれなかったのでしょう?一方で、BufferedReaderクラスのreadLine()メソッドはIOExceptionを発生させます。例えば、

mainメソッドの

------------------------------------------------------------------------
public static void main(String[] args) throws IOException {
------------------------------------------------------------------------

で、throws IOExcpetionを書かなかった場合(throwsキーワードは次号解説)、次のようにコンパイラはコンパイルエラーをだします。

------------------------------------------------------------------------
例外 java.io.IOException は報告されません。スローするにはキャッチまたは、スロー宣言をしなければなりません。
String fahrenheit = myBufferedReader.readLine();
------------------------------------------------------------------------

いったいコンパイル時にエラーを発生させるIOException とコンパイル時にエラーを発生させないNumberFormatExceptionの両者の違いは何なんでしょう?これを理解するには、CheckedとUncheckedの例外を理解しなければなりません。紙面の制約上、詳しい説明は次号にしたいと思います。お楽しみに。

ところで、上記のように、実はBufferedReaderクラスのreadLine()メソッドも例外IOExceptionをスローするのです(APIで実際にたしかめよ)。それをキャッチするには、

try {
fahrenheit = myBufferedReader.readLine();
}
catch (IOException e) {
System.out.println("入力ストリームでエラーが発生しました。
プログラムを終了します");
return;
}

とします。ここで、例外が発生したことをprintln()メソッドをつかってconsoleにアウトプットした後、return文で文が終了してしまいます。しかし、川の流れは未だに続いています。最後に、

myBufferedReader.close();

で入力ストリームを閉じてあげなければなりませんね。しかし、catch節のあとでは、returnでプログラムが終了してしまいます。かといって、catch節の中に

catch (IOException e) {
System.out.println("入力ストリームでエラーが発生しました。
プログラムを終了します");
myBufferedReader.close();
return;
}

とすると、例外が発生する時以外は、closeできません。

だったら、catch節が終わった後にもclose()文を書けばいいじゃん?

そうなんです。しかし、

catch (IOException e) {
System.out.println("入力ストリームでエラーが発生しました。
プログラムを終了します");
myBufferedReader.close(); // 二度の記述
return;
}

myBufferedReader.close(); // 二度の記述

これでは、同じ文を2度も記述しないといけないので何とも、効率が悪いですね。
ではどうすればいいのでしょう?そうです。finally節を使えばいいのです。finally節は、例外が発生しようとしまいと、必ず実行されるのでしたね。つまり、例外が発生して、catch節にプログラムの流れが移ったとしても、returnされる前に実行されるのです。


try {
fahrenheit = myBufferedReader.readLine();
}
catch (IOException e) {
System.out.println("入力ストリームでエラーが発生しました。
プログラムを終了します");
return;
}
finally {
myBufferedReader.close();
}

こうすることで、必ず(例外が発生しようとしまいと)、myBufferedReader.close()が実行されるようになります。
ただ、close()メソッドもIOExceptionをスローするので、

try {
fahrenheit = myBufferedReader.readLine();
}
catch (IOException e) {
System.out.println("入力ストリームでエラーが発生しました。
プログラムを終了します");
return;
}
finally {
try {
myBufferedReader.close();
}
catch (IOException e) {
System.out.println("入力ストリーム閉鎖中にエラーが発生しました。
プログラムを終了します");
}
}

というふうに、try、catch構文をネスト(Nest、重ね合わせる)することになります。

以下がコンプリートバージョン(完全版)です。

【ConvertToCelsius1_2.java】
━━━━━━━━━━━━ ここから ━━━━━━━━━━━━━━━━━━
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

/**
* 華氏・摂氏変換プログラム1_2 try and catch構文(完全版)
* ユーザーが入力した華氏を摂氏に変換する
*
* @author Mr.Hack
*/
public class ConvertToCelsius1_2 {

/**
* 華氏(Fahrenheit)から摂氏(Celsius)への変換
*
* @param fahrenheit 華氏
* @return celsius 摂氏
*/
static double convertToCelsius(double fahrenheit) {
double celsius = (fahrenheit - 32) * 5 / 9;
return celsius;
}

/**
* ユーザーに入力を促し、華氏を入力後、摂氏を計算し画面に表示する。parseDoubleで
* 例外が発生したときは、例外メッセージを表示しプログラムを終了する。
*
* @param args コマンドライン引数
*/
public static void main(String[] args) {

String fahrenheit = "";
double doubleFahrenheit = 0.0;
double celsius = 0.0;

System.out.println("===============================================================");
System.out.println(" --- 華氏から摂氏への変換プログラム 1 --- ");
System.out.println("===============================================================");

System.out.print("華氏(Fahrenheit)を入力せよ : ");

// バイトストリーム
InputStream myStream = System.in;
// キャラクタストリーム
InputStreamReader myStreamReader = new InputStreamReader(myStream);
// バッファーとして蓄える
BufferedReader myBufferedReader = new BufferedReader(myStreamReader);
// readLine()メソッドで行単位ごとに読む
try {
fahrenheit = myBufferedReader.readLine();
}
catch (IOException e) {
System.out.println("入力ストリームでエラーが発生しました。プログラムを終了します");
return;
}
finally {
try {
//input streamを閉じる
myBufferedReader.close();
}
catch (IOException e) {
System.out.println("入力ストリーム閉鎖中にエラーが発生しました。プログラムを終了します");
}
}
try {
//String型fahrenheitをdouble型へ変換
doubleFahrenheit = Double.parseDouble(fahrenheit);
}
// 例外が発生したときのみcatch構文が実行される
catch (Exception e) {
System.out.println("不正な値を入力したため、計算結果を表示せずに、プログラムを終了します");
return;
}
// double型の華氏をconvertToCelsius()メソッドで摂氏に変換
celsius = convertToCelsius(doubleFahrenheit);
System.out.println("あなたが入力した" + fahrenheit + "Fは、摂氏で" + celsius + "Cです");
}
}
━━━━━━━━━━━━ ここまで ━━━━━━━━━━━━━━━━━━

さて、今回はこの辺にして、来週は、例外処理の応用編にいってみたいと思います。来週はプログラムを作成するに当たっての実践的な例外処理のテクニックを披露します。今週の宿題は、銀行預金口座の例外発生に関するテストプログラムです。

■Question 5
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BankAccount.zipファイルを以下のURLからダウンロードしなさい。

http://mrhack.hoops.ne.jp/zip/BankAccount.zip

BankAccount.zipを解凍すると、BankAccount.classファイルとBankAccountクラスのAPIに関係のあるhtmlファイルが現れる。index.htmlファイルをクリックしなさい。

クリックすると、BankAccountクラスのAPI仕様が記載されているので、それを参考に、テストクラスBankAcountTest.javaを作成し、そのクラスのmain()メソッドでdeposit()、withdraw()、getBalance()メソッドをテストし例外が発生するかテストしなさい。

※BankAccountTest.javaをコンパイルするときは、BankAccount.classをBankAccountTest.javaと同じフォルダ(ディレクトリ)にコピーしなさい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ヒント

さて、前回あなたは、アメリカに旅行し例外が発生するプログラムを修正しました。日本に帰ってくると、Mr.Hackカンパニーの新入社員であるあなたは、Java珈琲ブレイクを購読していると上司にぽろっと言ってしまったため、『Java珈琲ブレイクを読んでいるのか?それなら、君は、クラスのテストの仕方を知っているな』といって、BankAccount.javaのテストクラスの作成を命じられます。テストなんて今までしたことがなかったので、右往左往です・・・。それも、肝心のjavaソースコードが手元にないのです。手元にあるのは、BackAccount.classファイルとそれのAPI仕様だけです。手がかりは、APIしかなさそうです。でも、よく見てみると、BankAccountのクラスの使い方等が書かれているじゃありませんか。そこであなたは、以下のようなBankAccountTest.javaを書き始めました・・・。

class BankAccountTest {
public static void main(String[] args) {
BankAccount account = new BankAccount();
try {
account.deposit(-1);
System.out.println("マイナス引数テスト失敗。例外発生できず");
}
catch (Exception e) {
System.out.println("マイナス引数テスト成功。" + e.getMessage());
}

}
}

APIを見ると、deposit()メソッドは少なくとも2種類の例外が、withdraw()メソッドは少なくとも3種類の例外が発生するようです。

全てのメソッドを上記の用にテストしてみてください。思ったように例外が発生してますか?

それでは、皆さんまたあいましょう。Have a nice day.

Mr.Hack


■ちょっと珈琲ブレイク
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Mr.Hackの通っているコンピューターサイエンス学科の学生は、最初にICS111(ICSはInformation & Computer Scienceの略)というコンピューターサイエンス入門というクラスをとります。このクラスは基本的にはJavaという言語自体と、オブジェクト指向プログラミングを学びます。また、平行して、141というDiscrete Mathematicsをとります。これは、コンピュータに関係のある数学、たとえば、Big O notationという計算にかかる時間を計算したり、数学的帰納法、ツリーのアルゴリズム等を学びます。それをとると211というコンピューターサイエンス入門2というクラスで、アルゴリズム(リンクリスト、ソート、ハッシュマップ等)をJavaを通して、プログラミングして学びます。211を取り終わると、C,C++を学んだり、Assembly Languageを学んだり、コアである311でデータ構造とアルゴリズムというクラスで、いろいろなアルゴリズム(たとえば、Quickソート、ツリーのDFSアルゴリズム等たくさん)を学びます。この311がかなり大変です。学部の中でこの科目が一番単位を取るのに難しいといわれています。通常はJavaを使って学びますが、Mr.Hackの時は、Pseudo Code(スードコード、疑似コード)というどの言語にも依存しないアイデアを記述する方法でアルゴリズムを記述していきます。これは、どの言語にも応用できるようにするという意味も含んでいます。それが取り終わるとはれて、Network、Operating System、Web Programming等多岐にわたり勉強できるようになります。つまり、コンピューターサイエンスを卒業する学生は、Javaの基礎はもちろん、基本的なアルゴリズムの計算の仕方、そのほか、C,C++、Assembly、Software Engineeringの基礎知識をもっているのです。

ここが、今の日本とアメリカのソフトウェア業界の歴然とした違いです。アメリカのソフトウェア関連会社はもちろん新入社員の教育はしますが、Javaのハウツーなんてしません。いかに、自分の会社のシステムになれてもらえるか、なれたら、どんどん実践力としてつかうよ、という教育なのです。日本の場合はどうでしょう。文学部を卒業した、法学部を卒業した、いままで、プログラミングなんかしたことない学生を社員として雇うのです。将来の可能性を信じて。それも、多額の研修費用を費やして。このシステムがいいか悪いかは別として、日本のソフトウェア会社の経営者の方々はこの辺の現状を考慮して行かないと、世界にはやはり通用していけないのかもしれませんね・・・。

ちなみに、Javaプログラマの新卒の給与は、差がありますが、40kから70kぐらい(USドル)らしいです。プログラマの地位はたかいですね・・・。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆Javaで珈琲ブレイク◆
────────────────────────────────────
皆様からの激励・批判のメールをお待ちしております。
【発行者】 Mr.Hack - javacafebreak@hotmail.com
【掲示板】 http://fweb.midi.co.jp/~romanhikou/cafe_entrance.html
※質問は上記の掲示板からどうぞ。
【サイト】 http://mrhack.hoops.ne.jp/
【発行数】 まぐまぐ[777] Melma[107]
【解除】http://mrhack.hoops.ne.jp/
※解除は上記のサイトからいつでもできます。
────────────────────────────────────
(c)2002 MR.HACK ALL RIGHTS RESERVED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

 


© 2002 MR.HACK ALL RIGHTS RESERVED