114 Views
January 26, 22
スライド概要
トピックス:プログラムの設計レシピ, 種々のエラー, プログラムのテスト, アサーション, 例外処理
Java の基本(スライド資料とプログラム例)(全17回)
https://www.kkaneko.jp/pro/pi/index.html
金子邦彦研究室ホームページ
https://www.kkaneko.jp/index.html
金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko
pi-16. プログラムのテ スト,アサーション, 例外処理 トピックス:プログラムの設計レシピ,種々のエ ラー,プログラムのテスト,アサーション,例外 処理 URL: https://www.kkaneko.jp/pro/pi/index.html (Java の基本,スライド資料とプログラム例) 金子邦彦 1
今回の内容 • プログラム設計レシピでは,プログラムの作成を,① 分析,②仕様,③例,④作成,⑤テストの5段階に分 ける • 「必ず成立しているはずのこと」を書いたものがア サーションである.Javaでは次のように書く.アサー ションは論理的エラーの発見に役立つ • 「x >= 0」がアサーション, • error, x < 0 in area() がメッセージ • 例外処理とは,不測の事態における処理 2
アウトライン 番号 項目 復習 16-1 プログラムの設計レシピ 16-2 種々のエラーとプログラムのテスト 16-3 アサーション 16-4 例外処理 各自、資料を読み返したり、課題に取り組んだりも行う この授業では、Java を用いて基礎を学び、マスターする 3
Java などのプログラミング言語の体 験,演習ができるオンラインサービス GDB online http://www.pythontutor.com/ オンラインなので、「秘密にしたいプログラム」を 扱うには十分な注意が必要 4
GDB online で Java を動かす手順 ① ウェブブラウザを起動する ② 次の URL を開く https://www.onlinegdb.com 5
③ 「Language」のところで,「Java」を選ぶ 6
④ ソースコードを入れる ⑤ 実行.実行結果を確認 「Run」をクリック. 7
16-1. プログラムの設計レシピ 8
リングの面積 • リング Ring クラスのオブジェクト 属性は,外径 r2, 内径 r1 r1 r2 • 面積 area メソッド (this.r2 * this.r2 - this.r1 * this.r1) * 3.14 9
演習 資料:11 ~ 12 【トピックス】 • プログラムの設計レシピ 10
① プログラム 11
② 実行し結果を確認 12
プログラム設計レシピ プログラムを設計するときに,考えておいた方がよ いこと,実行した方がよいことをリストアップした もの 13
プログラム設計レシピ ① 分析 ② 仕様 プログラムの設計段階で考えた方がよいこと ③例 ④ テスト プログラムが設計通りに動くかを確かめる 14
リングの面積 • リング Ring クラスのオブジェクト 属性は,外径 r2, 内径 r1 r1 r2 • 面積 area メソッド 15
① 分析 メソッド area • その入力 なし ・・・オブジェクトの属性 だけで足りる • その出力 数値1つ ・・・求まった面積 ※ 必要なメソッドそれぞれについて,入力と出力を 考える 16
② 仕様 メソッド area r1 を内径,r2 を外径とするリングの面積 r1 r2 メソッドの性能,機能の条件を考える 17
③例 メソッド area r1 = 3,r2 = 5 のとき,50.24 が求まる r1 r2 どのようなときに,どのような出力が出てほしいか 18
「③ 例」があることの効果 • 例があれば,プログラムが書きやすくなる • 例があれば,他の人がプログラムを見たとき,理 解しやすくなる • 例は,テストの実施に利用 19
④ テスト この通りの結果が得られることを 確かめる Ring a = new Ring(3, 5); 20
プログラム設計レシピ ① 分析 名前付け,入力と出力を明らかに ② 仕様 性能機能の条件 ③例 どのようなときに,どのような出力か ④ テスト プログラムが設計通りに動くか確認 21
プログラム設計レシピ ① 分析 名前付け,入力と出力を明らかに 名前:area,入力:なし,出力:数値1つ ② 仕様 性能機能の条件 r1 を内径,r2 を外径とするリングの面積 ③例 どのようなときに,どのような出力か r1 = 3,r2 = 5 のとき,50.24 が求まる ④ テスト プログラムが設計通りに動くか テスト用プログラム 22
16-2. 種々のエラーとプログラム のテスト 23
エラーの種類 ① 構文エラー(Syntax Errors) • 言語の書式に合っていない場合 ② 実行エラー(Run-time Errors) • プログラムが出力を出さない場合 ③ 論理的エラー(Logical Errors) • 出てきた出力が,仕様(性能機能の条件)に合致 しない場合 24
① 構文エラー スペルミスで, プログラムが 実行できない 25
実行エラーを含むプログラム class Ring { double r1; double r2; public Ring(double r1, double r2) { this.r1 = r1; this.r2 = r2; } public double area() { double x; x = (this.r2 * this.r2 - this.r1 * this.r1) / 0; return x; } } public class Main { public static void main(String[] args) { Ring a = new Ring(3, 5); System.out.println(a.area()); } } 26
③ 論理的エラー スペルミスで, おかしな答え が出ている 27
エラーの種類ごとに発見方法が異なる ① 構文エラー(Syntax Errors) • 言語の書式に合っていない場合 プログラムを実行させようとすると,実行できず,エ ラーメッセージが出る ② 実行エラー(Run-time Errors) • プログラムが出力を出さない場合 プログラムを実際に実行させる.そしてエラーメッ セージが出たり,プログラムが「止まっている」よう に見えたりする ③ 論理的エラー(Logical Errors) • 出てきた出力が,仕様に合致しない場合 プログラムを実際に実行させる.そしてテストする 28
分野の知識(Domain Knowledge) • プログラムを定義するには,プログラムをし ようとする領域の知識(分野の知識)が必要. • 音楽,交通工学,生物学,芸術 ・・・ など プログラムしたい領域の用語,知識の理解が必要 • 「対象分野に応じてプログラム言語自体を発明 する,設計する」という考え方も(興味のある 人は「Domain Specific Language」という言葉 で調べてみること) • コンピュータ言語のみにとらわれず,対象分野 のしっかりとした基礎の理解が不可欠. 29
16-3. アサーション 30
アサーション • 「必ず成立しているはずのこと」を書いたものが アサーションである.Javaでは次のように書く. アサーションは論理的エラーの発見に役立つ • 「x >= 0」がアサーション, • error, x < 0 in area() がメッセージ 31
アサーションをエラーの発見に役立てる 間違い(エラー)を含む式 実行結果の例 アサーションがない場合, 論理的エラーを見逃しそう 32
アサーションをエラーの発見に役立てる assert x >= 0 : "error, x < 0 in area()"; 実行結果の例 アサーションの機能により エラーメッセージが出る 33
• アサーションの機能は Java Tutor, GDB online, Paiza.io で動かすのが難しいので,前ページの実 演のみ(演習なし) 34
16-4. 例外処理 35
例外処理 • 例外処理とは,不測の事態における処理 不測の事態(例外)の例 • まさか「ファイルが無い」とは • まさか「プログラム中にバグがある」とは • まさか「半径が負の数に設定されている」とは • まさか「アサーションが成立しない」とは 例外処理の例 • 「ファイルを準備するように」とメッセージを出して処理 を再開 • 「正しい値を設定するように」とメッセージを出して処理 を終了 36
例外の 発生 例外処理 37
Java での例外処理 • throws Exception メソッド内で例外が発生する可能性があること • throw new Exception 例外の発生 • try { … } catch( … ) { … } 例外処理 38
throws Exception 「area メソッド内で,例外の発生があり える」と宣言(コンピュータに教える) r2 < r1 は想定外なので, 例外を発生させる 例外処理 39
Java での例外処理の書き方 try { 処理 } catch(Exception e) { 例外処理 } <処理>で例外が発生したときの 例外処理ができるようになる ※ 「Exception」のところは, 例外の種類を細かく指定することも可能 40
16-1 class Ring { double r1; double r2; public Ring(double r1, double r2) { this.r1 = r1; this.r2 = r2; } public double area() { double x; x = (this.r2 * this.r2 - this.r1 * this.r1) * 3.14; return x; } } public class Main { public static void main(String[] args) { Ring a = new Ring(3, 5); System.out.println(a.area()); } } 41
16-2 実行エラーを含むプログラム class Ring { double r1; double r2; public Ring(double r1, double r2) { this.r1 = r1; this.r2 = r2; } public double area() { double x; x = (this.r2 * this.r2 - this.r1 * this.r1) / 0; return x; } } public class Main { public static void main(String[] args) { Ring a = new Ring(3, 5); System.out.println(a.area()); } } 42
関連ページ • Java プログラミング入門 GDB online を使用 https://www.kkaneko.jp/pro/ji/index.html • Java の基本 Java Tutor, GDB online を使用 https://www.kkaneko.jp/pro/pi/index.html • Java プログラム例 https://www.kkaneko.jp/pro/java/index.html 43