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
r
1
r
2
演習
資料:11 ~ 12
【トピックス】
• プログラムの設計レシピ
9
10
① プログラム
11
② 実行し結果を確認
プログラム設計レシピ
プログラムを設計するときに,考えておいた方がよ
いこと,実行した方がよいことをリストアップした
もの
12
プログラム設計レシピ
① 分析
② 仕様
③ 例
④ テスト
13
プログラムの設計段階で考えた方がよいこと
プログラムが設計通りに動くかを確かめる
リングの面積
• リング Ring クラスのオブジェクト
属性は,外径 r2, 内径 r1
• 面積 area メソッド
14
r
1
r
2
① 分析
メソッド area
• その入力 なし ・・・オブジェクトの属性
だけで足りる
• その出力 数値1つ ・・・求まった面積
※ 必要なメソッドそれぞれについて,入力と出力を
考える
15
② 仕様
メソッド area
r1 を内径,r2 を外径とするリングの面積
メソッドの性能,機能の条件を考える
16
r
1
r
2
③ 例
メソッド area
r1 = 3,r2 = 5 のとき,50.24 が求まる
どのようなときに,どのような出力が出てほしいか
17
r
1
r
2
• 例があれば,プログラムが書きやすくなる
• 例があれば,他の人がプログラムを見たとき,理
解しやすくなる
• 例は,テストの実施に利用
「③ 例」があることの効果
18
④ テスト
19
この通りの結果が得られることを
確かめる
Ring a = new Ring(3, 5);
プログラム設計レシピ
① 分析 名前付け,入力と出力を明らかに
② 仕様 性能機能の条件
③ 例 どのようなときに,どのような出力か
④ テスト プログラムが設計通りに動くか確認
20
プログラム設計レシピ
① 分析 名前付け,入力と出力を明らかに
名前:area,入力:なし,出力:数値1つ
② 仕様 性能機能の条件
r1 を内径,r2 を外径とするリングの面積
③ 例 どのようなときに,どのような出力か
r1 = 3,r2 = 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