例外処理
・例外発生時のExceptionスローとログ出力を調べる。
・画面で多用している共通処理内での例外発生時の呼び出し元(オンライン処理とプレゼン処理)の対応は?
・例外
プログラム実行中に発生する「トラブル」
ex)
プログラマーの不注意で作り込むバグ
要件や仕様の間違い
実行マシンの不具合
他のソフトウェアとの連携不具合
…etc
・例外処理
万が一のトラブルに備えたプログラミング
×トラブル発生で停止する
×トラブル発生で動作しなくなる
×トラブル発生で動作するが正常処理しない
・構文
try{
例外が発生する可能性のある処理
}
catch(例外クラス型 変数){
例外が発生したときの処理
//このブロックの処理が終わる=トラブルは収束したとして、正常な動作に戻る。
}
finally{
例外発生の有無に関わらず必ず実行する処理
}
・例外クラス
エラー:プログラムが対処できないトラブル
例外 :プログラムが対処できるトラブル
Throwable
|
| ̄ ̄ ̄ ̄ |
Error Exception★
|
RuntimeException
・検査例外と非検査例外
コンパイラが例外処理の記述チェックをするか否かで、例外は検査例外と非検査例外に分類される。
⑴検査例外:try-catch文 or throws宣言句必須
①Exceptionクラス
②Exceptionクラスのサブクラス(RuntimeExceptionクラスを除く)
⑵非検査例外:try-catch文 or throws宣言句任意
①Errorクラス
②RuntimeExceptionクラス
③RuntimeExceptionクラスのサブクラス
継承と実現
⑴継承
あるクラスの機能を拡張した新しいクラスを定義すること。
サブクラス extends スーパクラス
サブクラスのインスタンス=スーパクラスのインスタンス + 差分のインスタンス
【継承しても引き継げないもの】
・コンストラクタ
・private フィールドとメソッド
【何のために使うか?】
○ポリモーフィズム※の実現のために使う
×差分プログラミングの実現のために使う
なぜなら、差分プログラミングでは、スーパクラスがどのサブクラスから継承されているか分からないため。
【多重継承】
・クラス 禁止
・インタフェース 許容
※実際に動作しているインスタンスをインスタンスの元となった型とは異なる型で扱える仕組み。ただし、関係(互換性)、つまり、継承関係か実現関係があること。
⑵実現
作成中
インタフェースとクラス
クラスの抽象度ヒエラルキー
インタフェース>抽象クラス>具象クラス
⑴インタフェース
他クラスからの「扱い方」を定義したもの
(クラスから型だけを取り出したもの)
interface Sample{
static final フィールド
public 抽象メソッド
}
・多重実現・多重継承 可能
・インタフェースはポリモーフィズムのために存在する。
・インスタンス化できない
⑵クラス
①抽象クラス
インタフェースとクラスの両方の性質を持ったクラスで、抽象メソッドが存在する。
抽象クラス{
様々なフィールド
具象メソッド{}
抽象メソッド
}
・抽象クラス extends 抽象クラス
・具象クラス extends 抽象クラス
・インスタンス化できない(インタフェースと同じ)
②具象クラス
具象メソッドのみ存在する。(抽象メソッドがあってはいけない)
具象クラス{
様々なフィールド
具象メソッド{}
}
・抽象メソッドは実装を持たないため、具象クラスとなるサブクラスが抽象メソッドをオーバーライドして、実装を提供しなければならない。
オーバライドとオーバーロード
⑴オーバーライド
サブクラスでスーパクラスに定義されたメソッドを「再定義」すること。
○スーパークラスの定義に加えて、サブクラスに新しい定義を追加(再定義)すること。
×スーパクラスの定義を上書き(overwrite)すること。
ルールは以下の3つのみ
・メソッドのシグニチャ(名、型、数、順番)は同じでなければいけない。
・戻り値の型は同じか、そのサブクラス型でなければいけない。
・アクセス修飾子は同じか、より緩いものでなければいけない。
※上書きなのではなく、JVMがインスタンス生成時に作成する「メソッド・ディスパッチ・テーブル」という仕組みによって、サブクラスでオーバーライドしたメソッドを優先してるってだけなのよ。
執筆中
ポリモーフィズム呼び出し
以下の場合、コンパイルエラーになるって分かります?
------------------------
//Main.class
public class Main{
public static void main(String[] args){
A a = new B();
a.sample();
}
}
------------------------
//A.class(クラスA)
public class A{
public void hello(){
//any code
}
}
//B.class(クラスAを継承するクラスB)
public class B extends A{
public void sample(){
//any code
}
}
------------------------
フィールドとメソッドの呼び出しは変数で定義された型のものしか使えない。
returnとexit
【return】
①処理の終了
②例外処理でfinallyブロック内の処理を実行する
-----------------
return;
//この行で処理を終了し、呼び出し元に処理を戻す。
-----------------
③戻り値
呼び出し先のメソッドが、呼び出し元に処理を戻す際、戻り値を返すか返さないかを決めることができる。
・戻り値を返さない場合
メソッド定義の戻り値の型に「void」、処理内で「return;」
・戻り値を返す場合
メソッド定義の戻り値の型に「void以外のデータ型」、処理内で「return [データ型に合致する変数や値];」
https://www.sejuku.net/blog/22842
【exit】
①プログラムの終了
②例外処理でfinallyブロック内の処理を実行しない
-----------------
System.exit()
//この行でプログラムを終了する。
-----------------
③終了コード
正常終了 :exitメソッドの引数に0を指定
正常終了以外:exitメソッドの引数に0以外を指定