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