リファレンス,配列,例外処理 その他演習に役立つこと

Slides:



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

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習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 というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
プログラミング基礎I(再) 山元進.
IO - 入出力 小西 亨.
プログラミング基礎I(再) 山元進.
アルゴリズムとデータ構造1 2007年6月12日
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
アルゴリズムとデータ構造 2011年6月13日
社会人学習講座 「Javaプログラミング概論」
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
アルゴリズムとデータ構造 2011年6月20日
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
コンパイラの解析 (2) GCJのデータ構造 - 1.
実行時のメモリ構造(2) Javaスタック内動作他
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
JAVA入門後期⑩ 情報処理試験例題解説.
例外処理 と ファイル入出力 情報システム学科 平塚 聖敏.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
暗号技術 ~JAVAプログラム③~ (7週目)
第3回 2007年4月27日 応用Java (Java/XML).
第6回 2007年6月1日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
暗号技術 ~JAVAプログラム①~ (5週目)
Collection, Generics, Iterator
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとデータ構造 2012年6月11日
JAVA入門③ 配列とコレクション.
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
暗号技術 ~JAVAプログラム②~ (6週目)
サブゼミ第7回 実装編① オブジェクト型とキャスト.
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
アルゴリズムとデータ構造 2010年6月17日
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

リファレンス,配列,例外処理 その他演習に役立つこと 2004年7月21日 海谷 治彦

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

例 別のインスタンス v :Vector もしくは staticメソッド :Button プログラム内では,インスタンス固有の名前ではなく, ・・・・ Vector v; v=new Vector(); // ココでインスタンスができる ・・・・・ v.add(new Button()); ・・・・・・ 別のインスタンス もしくは staticメソッド v :Vector :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の staticメソッド Human h Animal a Life li 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の staticメソッド Human h Animal a Life li :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; }

配列について 別途URLを参照.

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

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

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

例外を投げるメソッドの例 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言語では例外(例えばファイルが開けられない等)もすべて返り値で結果通知をしていた. しかし, なんとなし正常っぽいものは返り値. なんとなし異常っぽいものは例外. でメソッド呼び出し側に返すのがよい.

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

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

Collectionの実装 Collectionインタフェースを実装したクラス群のこと. API内にもかなり沢山ある. いわゆる「可変長配列」や「集合」を扱うことができるので,とっても便利. Cでせこせこリスト構造を作っていたのがバカらしくなる. 代表例. HashMap, ArrayList, Vector, HashSet Vectorの利用は昨今,お勧めでないらしい.

要は数学における「集合」に相当するものを表現できるクラス. 例 HashSet クラス java.util クラス HashSet java.lang.Object | +--java.util.AbstractCollection +--java.util.AbstractSet +--java.util.HashSet すべての実装インタフェース: Cloneable, Collection, Serializable, Set 直系の既知のサブクラス: JobStateReasons, LinkedHashSet 要は数学における「集合」に相当するものを表現できるクラス.

HashSetの主なメソッド boolean add(Object o) oをメンバーに入れる S ⇒ S ∪ {o} boolean remove(Object o) 削除 S ⇒ S \ {o} boolean contains(Object o) 含むか否かを判定 S ∋ o boolean containsAll(Collection c) 包含関係 S ⊃ c int size() 要素数.いわゆるcardinarity | S | Iterator iterator() 反復子を返す.(後述)

Iterator 反復子 昨今,添え字を使い集まり(集合や配列等)を列挙するより,Iterator というので列挙するほうが推奨されいる. 添え字での列挙が推奨されない理由? 配列等のように添え字があり順序付けされたもの以外の集まりを扱えない. 例えば,リンクドリスト(リスト構造)とか集合とか.

Interface Iterator 以下のメソッドの実装を指示している. boolean hasNext() 繰り返し処理で次の要素が存在すればtrue, なければfalse. Object next() 次の要素を返す. 他 Collectionインタフェースを実装したクラスは,メソッド Iterator iterator() を持ち,反復子による列挙が可能.

使い方の例