サスーンによる java 勉強会
DESCRIPTION
サスーンによる Java 勉強会. 2013 年 7 月 27 日. プレゼンター紹介. 名前: 吉村智志 生年月日: 1990 年 4 月 26 日生まれ 出身: 福井県福井市 所属:HAL東京IT学部高度情報処理学科 3 年 夢:自宅に図書館を作る。 カフェ +作業 スペース付き。 近所の子供たちに無料で開放して、PCやプ ログラミング、ビジネスの無料教室をやる !! Facebook: https ://www.facebook.com/satoroll. アジェンダ. ・ dispatcher って なんだっけ? - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/1.jpg)
サスーンによる Java 勉強会
2013 年 7 月 27 日
![Page 2: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/2.jpg)
プレゼンター紹介名前:吉村智志
生年月日: 1990年 4月 26日生まれ
出身:福井県福井市
所属:HAL東京IT学部高度情報処理学科 3
年
夢:自宅に図書館を作る。
カフェ+作業スペース付き。
近所の子供たちに無料で開放して、PCや
プ
ログラミング、ビジネスの無料教室をや
る !!
Facebook: https://www.facebook.com/satoroll
![Page 3: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/3.jpg)
アジェンダ
・ dispatcher ってなんだっけ?・継承?使ってなんの意味があるの?・オーバーライド?オーバロード?なんじゃあああ・自作例外作ってみたけどなんに使うのこれ?
![Page 4: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/4.jpg)
学ぶ前に ~ プログラミングの基本 ~
コンピューターは優秀なアホ・命令すれば何でも一瞬で終わらせれる天才的なスキルを持ちながらも、
・「覚えとけ」って言わないと一瞬でものを忘れる・知らないことがあると何もできないという天才なのかアホなのか、よくわからない性質を持ちます。
![Page 5: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/5.jpg)
プログラマーとしてこだわるところ
同じコードは二度書かない!!アホなコンピューターに対して同じ事を何回も命令するのはバカっぽい
1 と 3 を足して2 で割って
できました。
2 ですね
4 と 8 でさっき言った
処理やって
さっき言った処理?なんですかそれは?もっとはっきり言ってほしいんですけど
~
4 と 8 を足して 2 で割れっつってんだよ。 2 度言わすな。
6 だよ!つーか足して 2 で割るんなら最初っからそう言
えし。1 秒前のこととか覚えてねえ
し。
イラっ
![Page 6: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/6.jpg)
← こうならないためにも
「覚えとけ」って言ったことは必ず覚えているので「この処理方法を覚えとけ」って言って「さっき言った命令を実行しろ」って言う方が楽。
足して 2 で割るって処理をsasoon って名前で覚えとい
て
sasoon は足して 2 で割る処理ですね。
1 と 3 で sasoonやって
2 ですね。
4 と 8 で sasoonやって 6 ですね。
早い
![Page 7: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/7.jpg)
小休止質問とかあればどぞ
![Page 8: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/8.jpg)
クラスとは?クラス 関連性のある データ
メソッド をまとめたもの
変数とか関数とかの集合体ある意味「型」そのもの。 String とかも String っていうクラスを作って型にしてる。String クラスは char 型の変数をごにょごにょして文字列ぽく使えるようにしてる( 多分 )////////////さっきの話だと
「 a って言う名前の変数に 1 って数字入れて覚えといて」「 sasoon っていうメソッドを二つの数を足して 2 で割るっていう処理として覚えといて。」
とかいう覚えてもらうものの塊。
![Page 9: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/9.jpg)
ちなみに
「今ははっきり言えんけど、計算結果によって値変わるかもしれん。 でもその値使って処理したいからその値の名前を a って覚えといて」
って言うのが変数 a
変数 a を定義する = なんか値入れるもの a って名前で覚えといて
次から本題
![Page 10: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/10.jpg)
dispatcher とは?ディスパッチとは「割り当て」って意味です。
サーブレットのソースコードにこんな感じの記述があったと思います
protected void forward(String path, HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
//path は割当先の相対 URLRequestDispatcher dispatcher = req.getRequestDispatcher(path);
dispatcher.forward(req, resp);}
![Page 11: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/11.jpg)
解説
protected void forward(String path, HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
//path は割当先の相対 URLRequestDispatcher dispatcher = req.getRequestDispatcher(path);
dispatcher.forward(req, resp);}
ここで dispatcher さんに path って言う URL を割り当て
dispatcher さんは forward ってメソッドを持っている。効果は、割り当てられた URL の jsp に飛ぶって効果
![Page 12: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/12.jpg)
dispatcher.forword() って書いたりforword() って書いたりなんなん?
サーブレットには forword() なんていうメソッドはない。本当は毎回
String path = “ 飛びたい先の jsp の URL”;
RequestDispatcher dispatcher = req.getRequestDispatcher(path);
dispatcher.forward(req, resp);
こうやって書かなきゃならんけど、めんどくさいから↓のメソッド作ったはず。
protected void forward(String path, HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
//path は割当先の相対 URLRequestDispatcher dispatcher = req.getRequestDispatcher(path);
dispatcher.forward(req, resp);}サーブレット内に上みたいなメソッド作ったから forword(path,req,resp) だけ書くだけで良くなった。よくわかんないままコピペって進めてるとわからんくなる。
![Page 13: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/13.jpg)
小休止次は、継承について
こっから面白くなります .質問あったらどぞー
![Page 14: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/14.jpg)
継承についてゲームプログラミングを考えるとわかりやすいかも
例
スライマ ( 仮 ) はねスライマ( 仮 )
どちらもRPGゲームに出てくる敵キャラだと仮定して、こいつらがどんなことするか考えてみよう。
![Page 15: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/15.jpg)
スライマ ( 仮 ) の特徴 スライマ Lv10( 仮 ) さんのプロフィール
ステータス ・ HP:68・ちから :32・はやさ :48
「たたかう」をしてくる「ホイミ」を使ってくる
これをプログラミングで表すと...
![Page 16: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/16.jpg)
スライマ Lv10( 仮 ) さんの内部※ 分かりやすくところどころ日本語だけど、プログラミングでは全角文字は使わないようにしよう
public class スライマ{
int HP = 68;int ちから = 32;int はやさ = 48;
public void たたかう (){
// なんか相手にダメージ与える処理}
public void ホイミ (){
// なんか誰かを回復させる処理}
}
![Page 17: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/17.jpg)
じゃあはねスライマさんは? はねスライマ Lv10( 仮 ) さんのプロフィール
ステータス ・ HP:52・ちから :40・はやさ :58
「たたかう」をしてくる「かまいたち」を使ってくる
これをプログラミングで表すと...
![Page 18: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/18.jpg)
はねスライマ Lv10( 仮 ) さんの内部
public class はねスライマ{
int HP = 52;int ちから = 40;int はやさ = 58;
public void たたかう (){
// なんか相手にダメージ与える処理}
public void かまいたち (){
// なんか風属性のたたかうより強めなダメージ与える処理}
}
![Page 19: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/19.jpg)
ん?ちょっとまって
なんか殆ど一緒じゃね?↓それもそのはず。「スライマ」も「はねスライマ」も同じ「敵モンスター」というカテゴリ。
「敵モンスター」はみんな・ HP ・ちから・はやさ・たたかう・覚えている技を持っている。
![Page 20: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/20.jpg)
それをコンピューターに教えてあげるどっちも同じ要素持ってるならあらかじめ教えといた方が楽。
こんな感じで
public class 敵モンスター{
int HP;int ちから ;int はやさ ;
public void たたかう (){
// なんかダメージ与える処理}
// 技は種別によって使えるのが違うので、定義しない}
![Page 21: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/21.jpg)
ここで継承登場さっき作った「敵モンスター」ってクラスを継承させてスライマクラスを作る
public class スライマ extends 敵モンスター{
HP = 68;ちから = 32;はやさ = 48;
public void ホイミ (){
// なんか回復させる処理}
// たたかうは親クラスで定義しているのでここで定義する必要なし}
extends を入れると継承するよって意味
![Page 22: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/22.jpg)
お気づきだろうか?継承を使ったことによって、わざわざ「たたかう」メソッドの中身を何回も書かなくてよくなった。
→楽!今までは全モンスタークラスにたたかうメソッド書いてたけど 今後、はねスライマ、ぶちスライマ、キングスライマ、ゴールデンスライマ、etc いくら出てきても書く必要がない。 モンスター全種類分だったらどれだけコード量削減できるんですかね...
コンピューターの立場から見ても、
「あ、スライマクラスは HP, ちから , はやさって言う変数と たたかうってメソッドを持っているんだな。」
っていうのが分かって楽になる。変数名とかで間違えにくくなるし、 Eclipseとか使ってたら入力保管も出るし、いいことづくめ!
しかし、継承の利点はもう一個あります
![Page 23: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/23.jpg)
対象を抽象化できる対象を抽象化?なんのこっちゃ?
難しい言葉は一旦置いといて、スライマさんのホイミの処理を考えてみようか。
ホイミで「はねスライマ」の HP を回復するって処理はこんな感じに書ける
public void ホイミ ( はねスライマ hane){
// とりあえず一律 50 回復hane.HP += 50;
}
![Page 24: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/24.jpg)
ここで思い出して欲しいことJava は「型」を重要視する言語
宣言時、引数、戻り値、全部「型」指定しないといけない。
「あ?何 int 型に文字列入れようとしてんだよ。 こっちはわざわざ int って言った i の為に狭いメモリやりくりして int 分の 領域開けてやってんだよ。 それをいきなり文字列入れるとか、んなでけえもん入るわけねえだ ろ。」
….( マジギレかよ^^;)
↓ こんなことしちゃうとint i = “ ああああああああ” ;
こんな悲しいことになります。逆に、型を守ることができれば強固なプログラムになります。
![Page 25: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/25.jpg)
もう一回考えてみよう// ホイミで「はねスライマ」の HP を回復する処理
public void ホイミ ( はねスライマ hane){
// とりあえず一律 50 回復hane.HP += 50;
}
これ、引数に「はねスライマ型」って書いてあるし、はねスライマしか回復できなくね?
スライマさん、僕は回復してくれないとかひどいっすよ
大怪我を負ったキラーパンマー君 Lv1( 仮 )
![Page 26: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/26.jpg)
大怪我を負ったキラーパンマー君 Lv1( 仮 )を回復させるには?
ん、「キラーパンマー」も、「はねスライマ」も、どっちも「敵モンスター」じゃね?ということはこう書けばいいんじゃ?↓
// ホイミで「敵モンスター」の HP を回復する処理
public void ホイミ ( 敵モンスター teki){
// とりあえず一律 50 回復teki.HP += 50;
} 「敵モンスター」は HP って変数持ってたね。「ホイミ」って処理は敵モンスターの誰かが引数で渡されるから、渡された誰かの HP を 50 足してやればいいんだね。
![Page 27: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/27.jpg)
これが抽象化「はねスライマ」も、「キラーパンマー」も「敵モンスター」クラスを継承してるからこそスライマ Lv10( 仮 ) さんのホイミ () で回復できる対象に選べるようになった。
親のクラスを継承してるクラスは、親クラス型としても扱うことができる!!!!
因みに、 Eclipse さんは親クラスのことをスーパークラスって呼んでるよ。
![Page 28: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/28.jpg)
もし継承してなかったらもし「敵モンスター」を継承してなかったらホイミ () の処理はこう書かなきゃならなかった。
public void ホイミ ( はねスライマ hane){
// とりあえず一律 50 回復hane.HP += 50;
}
public void ホイミ ( キラーパンマー kira){
// とりあえず一律 50 回復kira.HP += 50;
}
public void ホイミ ( キングスライマ king){
// とりあえず一律 50 回復king.HP += 50;
}//他、モンスター数百種類分の引数の型のホイミ () を定義しなければならない。だるっ!
![Page 29: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/29.jpg)
なので、大事なこと今回の Java の課題、いきなりコード書き始めた人も多かったと思います。
しかし、プログラマーならば、まずコードを書く前に、
・どんな機能があるか・その機能の為にどんなメソッドが必要か・その機能の為にどんな変数が必要か・それらは、どういった塊に纏められるか
等を考えて、それらをクラスにしていきます。クラス一つ一つに決まった意味を持たせます。
それが「クラス設計」です。どんなプログラムだったら使いやすいか、分かり易いかを考えてからコードを書きましょう。
さっきの例だったらキャラクタークラスを継承して味方クラスと敵クラスに分けて欲しいわ。あと、覚える技系統ごとに技クラスもつくって、キャラクタークラスの中に技クラスを入れて欲しいわ。
![Page 30: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/30.jpg)
小休止因みに、さっきオーバーロード使ってまし
た。次はオーバーロードとオーバーライドにつ
いてです。質問あればどぞ。
![Page 31: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/31.jpg)
オーバーロードについてさっきのダメなパターンのホイミ () の書き方
public void ホイミ ( はねスライマ hane){
// とりあえず一律 50 回復hane.HP += 50;
}
public void ホイミ ( キラーパンマー kira){
// とりあえず一律 50 回復kira.HP += 50;
}
public void ホイミ ( キングスライマ king){
// とりあえず一律 50 回復king.HP += 50;
}これ、実はオーバーロードしてます。
![Page 32: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/32.jpg)
どの辺がオーバーロード?オーバーロードとは、同じメソッドを違う「型」の引数でもう一個定義してあげる事。
public void ホイミ ( はねスライマ hane){
// とりあえず一律 50 回復hane.HP += 50;
}
public void ホイミ ( キラーパンマー kira){
// とりあえず一律 50 回復kira.HP += 50;
}
「はねスライマ型」でも「キラーパンマー型」でも引数に持つことができる。これがオーバーロード。
でも、さっき言った通りこれは悪い例。
![Page 33: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/33.jpg)
じゃあどんな時に使うのさ?例えば、キラーパンマーは 50 しか回復しないけど、「はねスライマ」だけ HP が100 回復する「ラブリーはねスライマ」って技があったら
public void ラブリーはねスライマ ( キラーパンマー kira){
kira.HP += 50;}
// はねスライマは効果違うpublic void ラブリーはねスライマ ( はねスライマ hane){
hane.HP += 100;}
同じ「ラブリーはねスライマ」って技なのに、「はねスライマ」のときだけ効果が違うようになった!!
ラブリーはねスライマ!
50ラブリーはねスライマ!
100
![Page 34: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/34.jpg)
他にもこんなことできる・「ラブリーはねスライマ」が「はねスライマ」だけ 2 体選択して回復できる技なら
public void ラブリーはねスライマ ( キラーパンマー kira){
kira.HP += 50;}
// はねスライマは効果違うpublic void ラブリーはねスライマ ( はねスライマ hane){
hane.HP += 100;}
// はねスライマなら 2 体選ぶことができる!!public void ラブリーはねスライマ ( はねスライマ hane1, はねスライマ hane2){
hane1.HP += 100;hane2.HP += 100;
}
ラブリーはねスライマ!
100
100
はねスライマさんだけずるいっす
![Page 35: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/35.jpg)
オーバーロードのいいところ・同じメソッドなのに、違う引数の「型」で書ける・同じメソッドなのに、違う引数の数が持てる・引数の「型」とか、数に応じて処理の中身を変えられる
つまり、
一つのメソッドにその時々に応じて色んな処理をさせることができる
![Page 36: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/36.jpg)
小休止質問あったらどぞ
次はオーバーライド
![Page 37: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/37.jpg)
オーバーライドの前にオーバーライドについて学ぶ前に思ってほしいこと。
オーバーロードとオーバーライド、名前が似てますが、そんなこと気にしなくていいです。
オーバーロードって言うのは同じメソッドだけど引数によって色々変えられるていうのはさっき勉強しましたね?
大事なのは、 Java にはメソッドの引数を変えることで処理の中身を変えられるってことを知っているかどうか。それをオーバーロードって読んでるだけで、オーバーロードだろうがオーバードーロだろうがなんだっていいんです。「オーバーライドとオーバーロードってどっちがどっちだっけ?」って悩むのは筆記試験前だけで十分。
![Page 38: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/38.jpg)
オーバーライドとは?
「親クラスで定義されているメソッドを子クラスで再定義すること」
は?よくわからんので、後回しにして、なんか言いたいことがある輩がいるそうです。
俺様の「たたかう」は普通のやつより 2倍強えんだよ。他のやつと一緒に
すんな。
なんかほざいてますね。一体何のことを言っているのでしょうか?
好戦的ないたずらもぐマ Lv99( 仮 ) さん
![Page 39: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/39.jpg)
好戦的ないたずらもぐマ Lv99( 仮 ) さんが言っていること
とりあえず、好戦的ないたずらもぐマ Lv99( 仮 ) さんの中身をのぞいてみましょうか。
public class いたずらもぐマ extends 敵モンスター{
HP = 99;ちから = 200;はやさ = 99;
public void あなほり (){
// なんかなんか穴掘る処理}
// たたかうは親クラスで定義しているのでここで定義する必要なし} これのことを
言ってんだよ!
![Page 40: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/40.jpg)
好戦的ないたずらもぐマ Lv99( 仮 ) さんの「たたかう」を他のキャラクターの
2倍の威力にするには?現在の「たたかう」の処理はこうなっています。
public class 敵モンスター{
int HP;int ちから ;int はやさ ;
// 「たたかう」はとりあえず一律 50 ダメージpublic void たたかう ( 味方キャラ mikata){
mikata.HP -= 50;}
}
![Page 41: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/41.jpg)
それをこうしてやればいいいたずらもぐマクラスだけ、「たたかう」の威力を 2倍にしてやればいのです。
public class いたずらもぐマ extends 敵モンスター{
HP = 99;ちから = 200;はやさ = 99;
public void あなほり (){
// なんか穴掘る処理}
//親クラスのたたかう () を再定義public void たたかう ( 味方キャラ mikata){
mikata.HP -= 100;}
}
![Page 42: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/42.jpg)
はい、今オーバーライドしましたー!いたずらもぐマクラスで親クラスである敵モンスタークラスのたたかう () を再定義したため、「いたずらもぐマ」のたたかう () は 100 ダメージ、それ以外のモンスターのたたかう () は 50 ダメージ与える処理になりました。
俺様のたたかう () はその辺のやつとは違うんだ。他の敵モンスターと一緒にされちゃ困る。
つまり、親クラスですでに定義されているメソッドを子クラスで再定義するということです。
あれ?最初に言ったことと同じ事言ってる!
![Page 43: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/43.jpg)
ルール的なこと
1.戻り値、メソッド名、引数の型、数が同じであること
2.public →private 等、アクセスレベルを厳しくして再定義はできない
3.親クラスの throw で指定した例外を無視して例外を throw できない
4.final がついてるやつはオーバーロードできない
5.abstract がついてるやつはオーバーロードされなきゃならん。さもなくば自分がabstract になる
下記にオーバーロードのルール的な事なんか色々書いてありますが、気にしなくていいです。この辺のことは、コード書いてれば自然と Eclipse さんが教えてくれます。
![Page 44: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/44.jpg)
オーバーライドのいいところさっきみたいに、
だいたいみんなおんなじことやるんだけど、コイツの時だけちょっと違う
なんて時に使えます。
オーバーライドなんて言葉意識しなくても自然に使うことになるので、
親クラスのメソッドは、子クラスで書き直せるってことを知ってれば大丈夫です。
ちなみに Eclipse さんは子クラスのことをサブクラスって呼んでるよ。
![Page 45: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/45.jpg)
小休止質問あったらどぞー
次は自作例外について
![Page 46: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/46.jpg)
自作例外を学ぶ前に
自作例外を作る意味ですが、それを考える前に、まず例外処理を行うメリットについて考えてみましょう。
ここまでの内容で、疑問に思ったことはありませんか?
ホイミ () で回復しようにも既に死んじゃってたらどうしよう?それか詠唱中のスライマさんほっといて逃げ出すかも。
かわいそうなキラーパンマー君 Lv1( 仮 )
![Page 47: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/47.jpg)
かわいそうなキラーパンマー君 Lv1( 仮 )が言ってること
彼が言っているのはこういうことですね。
逃げ出している!
ホイミ!既に死んでいる !
OR
※ ここから説明するのは、実際のゲームではあり得ることなので「例外」としては適切ではありませんが、分かり易さ重視の為に「例外」として説明します。
ホイミを使う事前条件として、 1.生きていること ,2.逃げていないことが挙げられますね!
できない!
![Page 48: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/48.jpg)
ここでちょっと整理ここで、ホイミ () を使用するときのシナリオを整理しましょうか。
ホイミ () のシナリオ{
1. ホイミ () 使用を選択する
2. 回復対象のモンスターを選ぶ
3. 対象を回復させる{
3a. モンスターが生きている場合 (成功シナリオ )//50 回復
}{
3b. モンスターが死んでいた場合 (失敗シナリオ )//死んでる例外
}{
3c. モンスターが逃げていた場合 (失敗シナリオ )//逃げてる例外
}}
![Page 49: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/49.jpg)
例外とか気にしないで流れを作ってみた ZE☆
//取り合えず事前条件をチェック DA!//1.死んでないか確かめる!if( キラーパンマー == 死んでる ){
// キラーパンマーは既に死んでます。ってエラー}//2.逃げていないか確かめる !else if( キラーパンマー != 逃げてる ){
// キラーパンマーは逃げ出しています。ってエラー}//3. ようやく正しい時の処理else{
スライマ . ホイミ ( キラーパンマー );}
![Page 50: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/50.jpg)
ん?ちょっとまって。これってホイミ使うときは毎回いちいち事前に死んでないか逃げてないか確認しなきゃならないの?めんどくさ!確認とか忘れるし !
毎回毎回確認してられっか!ホイミとか毎日何百回も使ってんだよ!
![Page 51: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/51.jpg)
それが例外を使ったらこうなるtry{
//50 回復スライマ . ホイミ ( キラーパンマー );
}catch( モンスター死んでる Exception e){
// モンスターは既に死んでます。ってエラー}catch( モンスター逃げてる Exception e){
// モンスターは逃げ出しています。ってエラー}
![Page 52: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/52.jpg)
なんかどっかで見たような...
3. 対象を回復させる{
3a. モンスターが生きている場合 (成功シナリオ )
//50 回復}{
3b. モンスターが死んでいた場合 (失敗シナリオ )
//死んでる例外}{
3c. モンスターが逃げていた場合 (失敗シナリオ )//逃げてる例外
}
try{
//50 回復スライマ . ホイミ ( キラーパンマー );
}catch( モンスター死んでる Exception e){
// モンスターは既に死んでます。ってエラー}catch( モンスター逃げてる Exception e){
// モンスターは逃げ出しています。ってエラー}
例外を意識した Java プログラム ホイミ () を使うときに考えたシナリオ
ほぼ一緒やん!!
![Page 53: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/53.jpg)
例外を使ういいところ
現実世界で考えたシナリオと対応してめっちゃ分かり易くプログラムが書ける !
なので、プログラムを書く前に、機能が上手くいくシナリオを考えて、機能を使うときの
事前条件を予め決めておくのが大事。
※注意点 例外は、それを通知する為だけに使うこと。さっきの例だったら、キラーパンマーが死んでたらそれを通知する処理だけを行うこと。生き返らせたり、別のキャラを回復させたりしたい場合は、ホイミ () の技のメソッドの中の処理に書くこと。
![Page 54: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/54.jpg)
んじゃ例外を自作する意味って?
はい、お待たせしました。自作例外の話をします。
もし、さっきのホイミ () の実装がこんな場合
public void ホイミ ( 敵モンスター teki) throws ホイミException{
teki.HP += 50;}
なんかホイミ () で例外が起こった時に投げる例外
![Page 55: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/55.jpg)
あれれー?なんかおかしいよーホイミ () で投げる例外が「ホイミ Exception 」なので catch できるのは「ホイミException だけ」
さっきの例はこう書かなきゃならない
try{
//50 回復スライマ . ホイミ ( キラーパンマー );
}catch( ホイミ Exception e){
// ホイミでなんかおかしなことが起こってます。ってエラー} ホイミ () は throws でホイミ Exception を投げるって言ってるんでしょ。
だったら、それ以外の例外なんて来ないっしょ。ホイミ Exception の為だけにマジで準備すっからそれ以外は受け取んねえぜ
![Page 56: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/56.jpg)
このままじゃモンスターが死んでるからエラーなのか、
逃げてるからエラーなのかわからん!
どうやってデバッグすればいいんだ...
ここで、自作例外登場!モンスター死んでる Exception と モンスター逃げてる Exceptionを自分で作っちゃえばいいんだ!クラスファイルを新たに作って定義!
class モンスター死んでる Exception extends ホイミ Exception{
}
class モンスター逃げてる Exception extends ホイミ Exception{
}
発生させたい場面の例外を継承させる例外ごとに別ファイルで作ってね
![Page 57: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/57.jpg)
こんなこともできる
例外だってクラスなので、変数やメソッド持つことができるぞ!
class モンスター死んでる Exception extends ホイミ Exception{
public void メッセージ (){
System.out.println(“ モンスターは既に死んでます” );}
}
class モンスター逃げてる Exception extends ホイミ Exception{
public void 逃げたターン表示 (int 逃げたターン ){
System.out.println(“ そいつは既に” + 逃げたターン + ”目に逃げています” );
}}
![Page 58: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/58.jpg)
それを踏まえてこうなった// ホイミ () の中身。自作した例外クラスは import しとく
public void ホイミ ( 敵モンスター teki) throws モンスター死んでる Exception , モンスター逃げてるException{
if(teki == 死んでる状態 ){
throw new モンスター死んでる Exception();}else if(teki == 逃げてる状態 ){
throw new モンスター逃げてる Exception();}
teki.HP += 50;
}
![Page 59: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/59.jpg)
ホイミを呼び出す側のプログラムはtry{
//50 回復スライマ . ホイミ ( キラーパンマー );
}catch( モンスター死んでる Exception e){
// さっきモンスター死んでる Exception で定義したメッセージ表示メソッドを使う
//” モンスターは既に死んでます”が表示されるe. メッセージ ();
}catch( モンスター逃げてる Exception e){
// さっきモンスターは逃げてる Exception で定義したターン数表示メソッドを使う
//逃げたターン数が表示されるe.逃げたターン表示 (逃げたターン );
} エラーの際メッセージが表示されて、デバッグしやすい!
![Page 60: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/60.jpg)
ちなみに今、ホイミを呼び出す側のプログラムってありましたよね?
あれが、今回の評価課題でいうところの Servlet クラスです。web.xml で指定したあれです
各モンスターのクラスは自作クラスとして、敵モンスター package の中にでも入れときましょう。それが今回の課題でいうところの Select や Insert等の処理をさせるクラス(もっと複雑だけど)になります。例外クラスは別に例外用のパッケージ作って入れときましょう。
こんな感じでプログラムは設計されていきます。大体は、処理を行うクラスと、それを呼び出すクラスがあって、それを組み合わせていきます。
![Page 61: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/61.jpg)
今回例外を自作したことで、
・現実で考えたシナリオの流れとほとんど変わらないプログラムを書くことができた!!
・エラーの原因が特定できるようになり、デバッグが楽になった!!
![Page 62: サスーンによる Java 勉強会](https://reader031.vdocuments.net/reader031/viewer/2022032607/5681309d550346895d968b6f/html5/thumbnails/62.jpg)
終わり!!!!あとは自分のソース見直してみて。
アンケートかいてね!質問あったらどぞー。