リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
プログラミング第5回 1 while ループ 文字列の操作
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
コンパイラ 2011年11月14日
IO - 入出力 小西 亨.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
コンパイラの解析 (2) GCJのデータ構造 - 1.
実行時のメモリ構造(2) Javaスタック内動作他
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
ソフトウェア工学 知能情報学部 新田直也.
JAVA入門.
UDPマルチキャストチャット                    空川幸司.
独習Java ・ 8.1  例外処理 ・ 8.2  catch ブロックの検索  12月 5日    小笠原 一恵.
例外処理 と ファイル入出力 情報システム学科 平塚 聖敏.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
リファレンス,配列,例外処理 その他演習に役立つこと
暗号技術 ~JAVAプログラム③~ (7週目)
第6回 2007年6月1日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
暗号技術 ~JAVAプログラム①~ (5週目)
Collection, Generics, Iterator
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
クラスファイルの構造解析(2) 2003年6月23日 海谷 治彦.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
ソフトウェア制作論 平成30年11月21日.
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
アルゴリズムとプログラミング (Algorithms and Programming)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造演習(7月1日) 例外処理 2019/5/8.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
暗号技術 ~JAVAプログラム②~ (6週目)
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
プログラミング 2 静的変数.
Presentation transcript:

リファレンスの復習と例外処理 2005年6月14日 海谷 治彦

リファレンス reference 参照, refer 参照する. ま,改め紹介しなくてもJava遣いなら誰でもつかってる. インスタンスをプログラム中から識別(捕獲)するためのラベルのようなもの. Cでいうところのポインタ変数に相当. Javaでは,あるインスタンスを参照するリファレンスが1つもなくなると,勝手にインスタンスは消去される. AutoGC(自動ゴミ集め)機能.

例 別のインスタンス v :ArrayList もしくは staticメソッド :Button ・・・・ ArrayList v; v=new ArrayList(); // ココでインスタンスができる ・・・・・ v.add(new Button()); ・・・・・・ 別のインスタンス もしくは staticメソッド v :ArrayList :Button プログラム内では,インスタンス固有の名前ではなく, あるインスタンスから見た相対的な名前で処理をする. そのような相対的な名前が「リファレンス」

複数リファレンスで1つのインスタンスを指す public class UnivClass { private Student student; public static void main(String[] args) { UnivClass uc=new UnivClass(); Student s=new Student(); s.setUnivClass(uc); } public Student getStudent() { return student; public void setStudent(Student student) { this.student = student; public class Student { private UnivClass univClass; public static void main(String[] args) { } public UnivClass getUnivClass() { return univClass; public void setUnivClass(UnivClass univClass) { this.univClass = univClass; uc univClass :UnvClass 異なるクラス間で同一インスタンスの共有ができる.

リファレンスの型付け リファレンスはどのクラスを指すかの型情報を持つ. 基本的にあるクラス(型)のインスタンスは,同じクラス(型)のリファレンスで指す. しかし,スーパークラス(もしくはインタフェース)のリファレンスで指してもよい. 無論,使えるメソッドは少なくなるが.

例 :Human Humanのインスタンスだが, そのsuperクラスで参照(refer) してよい. あるコード の部分 Human h public class Human extends Animal { public static void main(String[] args) { Human h=new Human(); Animal a=h; Life li=h; } protected void war() {} あるコード の部分 Human h Animal a Life li Humanのインスタンスだが, そのsuperクラスで参照(refer) してよい. :Human

インタフェースでも同様 public class ShindaiSei implements Student, PrivateTeacher, Clerk { public static void main(String[] args) { ShindaiSei ss=new ShindaiSei(); Student s=ss; PrivateTeacher pt=ss; Clerk c=ss; }

例外処理 Exception 名前の通り通常ではない例外的,というか異常事態を処理するための機構. 現代的なプログラミング言語はほとんどこの機構を持つ. メソッド(関数)の処理が最後まで実行されず途中でコケるような事態の処理を想定している. ゼロで割り算. 配列の添え字の範囲を超える. (入出力)装置の異常. 等

例外を処理しないと? プログラムが途中で異常終了する. C言語等では異常終了するような要因を抑え込んで,プログラムを続行する手段がなかった. signal等,エグい手を使えばできないことはないが.

例外を捕まえる 「異常終了を抑え込む」もっとも一般的な戦略. API内クラスの一部メソッドは特定の状況下で例外を発生(投げる)ようになっている. 投げられた例外を適切に捕まえる(catch)するスキルがまず必要. 基本的には以下のような文法. try{ 例外発生の可能性があるメソッド呼び出しの列 }catch(ある例外型 exp){ 発生した例外情報をもつインスタンスへの リファレンスexpを使い, 例外事態を処理する.(通常は無視か・・・) }finally{ 例外の有無に関係なく必ず実行される. }

例外を投げるメソッドの例 java.io クラス BufferedReader java.lang.Object | +--java.io.Reader +--java.io.BufferedReader readLine public String readLine() throws IOException 1 行のテキストを読み込みます。1 行の終端は、改行 ('\n') か、復帰 ('\r')、または復行とそれに続く改行のどれかで認識されます。 戻り値: 行の内容を含む文字列、ただし行の終端文字は含めない。ストリームの終わりに達している場合は null 例外: IOException - 入出力エラーが発生した場合

ここでの表現は文字列を取得する際の定型です. 例: stdinから文字を読む import java.io.*; // 中略 InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int c=0; while(true){ String s=null; try{ s=br.readLine(); // ココが例外IOExceptionを投げる可能性のある部分 }catch(IOException e){ e.printStackTrace(); // 結果として例外の経緯を表示して, break; // ループを抜ける対処をしている. } System.out.println(c+": "+s); c++; if(s.length()==0) break; ここでの表現は文字列を取得する際の定型です.

例外処理と正常処理との違い 例外(エラー)と正常は「意味領域」の話なので,ある計算結果がどちらになるかは主観的. というか「仕様」によって,何が例外で何が正常かが決まる. よって結果を返り値とするか例外とするかの文法的なガイドラインは無い. 例外インスタンスとして計算結果を返すようなプログラミングも可能である.(無論,変なプログラム) C言語では例外(例えばファイルが開けられない等)もすべて返り値で関数呼び出し側に通知をしていた. しかし, なんとなし正常っぽいものは返り値. なんとなし異常っぽいものは例外. でメソッド呼び出し側に返すのがよい.

悪い例: 計算結果を例外で返す

複数種類の例外を分別して補足 tryブロック内で例外発生が監視される. しかし,ブロック内で複数種類の例外が発生するかもしれない. 種類が違えば,例外処理内容も無論,違うだろう. よって,複数種類の例外の分別処理が必要. 詳細は例題にて.

例外の委譲 throw 例外を補足(catch)したメソッドで,例外復帰処理ができない場合,復帰処理を呼び出し側メソッドに委譲できる. 要は例外処理の「たらいまわし」 詳細は例題にて.

例外クラスを自分で作る 前項の例がそうだが,当面初心者は手を出す必要がないと思う. 文法は単純だが意味の理解が難しい. 当面はAPI内のクラスにあるメソッドが投げる例外を正しく捕獲(catch)できるスキルを磨こう.