---
title: pi-16. プログラムのテスト, アサーション, 例外処理
tags:  #java #設計レシピ #種々のエラー #プログラムのテスト #アサーション #例外処理 #金子邦彦研究室  
author: [kunihikokaneko](https://convert.docswell.com/user/6674398749)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/9J2NVVYRER.jpg?width=480
description: トピックス：プログラムの設計レシピ, 種々のエラー, プログラムのテスト, アサーション, 例外処理   Java の基本（スライド資料とプログラム例）（全１７回）  https://www.kkaneko.jp/pro/pi/index.html  金子邦彦研究室ホームページ https://www.kkaneko.jp/index.html
published: January 26, 22
canonical: https://convert.docswell.com/s/6674398749/5Q9RX5-2022-01-26-125708
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/9J2NVVYRER.jpg)

pi-16. プログラムのテ
スト，アサーション，
例外処理
トピックス：プログラムの設計レシピ，種々のエ
ラー，プログラムのテスト，アサーション，例外
処理
URL: https://www.kkaneko.jp/pro/pi/index.html
（Java の基本，スライド資料とプログラム例）
金子邦彦
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/DEYP33G5EM.jpg)

今回の内容
• プログラム設計レシピでは，プログラムの作成を，①
分析，②仕様，③例，④作成，⑤テストの５段階に分
ける
• 「必ず成立しているはずのこと」を書いたものがア
サーションである．Javaでは次のように書く．アサー
ションは論理的エラーの発見に役立つ
• 「x &gt;= 0」がアサーション，
• error, x &lt; 0 in area() がメッセージ
• 例外処理とは，不測の事態における処理
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/VJN5VVG478.jpg)

アウトライン
番号
項目
復習
16-1
プログラムの設計レシピ
16-2
種々のエラーとプログラムのテスト
16-3
アサーション
16-4
例外処理
各自、資料を読み返したり、課題に取り組んだりも行う
この授業では、Java を用いて基礎を学び、マスターする
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/YE9Y66W4J3.jpg)

Java などのプログラミング言語の体
験，演習ができるオンラインサービス
GDB online
http://www.pythontutor.com/
オンラインなので、「秘密にしたいプログラム」を
扱うには十分な注意が必要
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GE86ZZNV7D.jpg)

GDB online で Java を動かす手順
① ウェブブラウザを起動する
② 次の URL を開く
https://www.onlinegdb.com
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LEL9DDPRJR.jpg)

③ 「Language」のところで，「Java」を選ぶ
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4JMZPP4PEW.jpg)

④ ソースコードを入れる
⑤ 実行．実行結果を確認
「Run」をクリック．
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PJR611WY79.jpg)

16-1. プログラムの設計レシピ
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/PEXMYYP47X.jpg)

リングの面積
• リング Ring クラスのオブジェクト
属性は，外径 r2, 内径 r1
ｒ1 ｒ2
• 面積 area メソッド
(this.r2 * this.r2 - this.r1 * this.r1) * 3.14
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/3EKG33DPJD.jpg)

演習
資料：11 ～ 12
【トピックス】
• プログラムの設計レシピ
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/L73NGGR475.jpg)

① プログラム
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/87DW11Y5JG.jpg)

② 実行し結果を確認
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VJP9QQ6DE8.jpg)

プログラム設計レシピ
プログラムを設計するときに，考えておいた方がよ
いこと，実行した方がよいことをリストアップした
もの
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/2EVM553GEQ.jpg)

プログラム設計レシピ
① 分析
② 仕様
プログラムの設計段階で考えた方がよいこと
③例
④ テスト
プログラムが設計通りに動くかを確かめる
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/57GG66YD7L.jpg)

リングの面積
• リング Ring クラスのオブジェクト
属性は，外径 r2, 内径 r1
ｒ1 ｒ2
• 面積 area メソッド
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/4EQX44MX7P.jpg)

① 分析
メソッド
area
• その入力 なし
・・・オブジェクトの属性
だけで足りる
• その出力 数値１つ
・・・求まった面積
※ 必要なメソッドそれぞれについて，入力と出力を
考える
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/KJ46QQV271.jpg)

② 仕様
メソッド
area
r1 を内径，r2 を外径とするリングの面積
ｒ1 ｒ2
メソッドの性能，機能の条件を考える
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/LE1VPP3K7G.jpg)

③例
メソッド
area
r1 = 3，r2 = 5 のとき，50.24 が求まる
ｒ1 ｒ2
どのようなときに，どのような出力が出てほしいか
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GEWL22PP72.jpg)

「③ 例」があることの効果
• 例があれば，プログラムが書きやすくなる
• 例があれば，他の人がプログラムを見たとき，理
解しやすくなる
• 例は，テストの実施に利用
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/47ZMDDK6E3.jpg)

④ テスト
この通りの結果が得られることを
確かめる
Ring a = new Ring(3, 5);
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/YJ6N11QLJV.jpg)

プログラム設計レシピ
① 分析
名前付け，入力と出力を明らかに
② 仕様
性能機能の条件
③例
どのようなときに，どのような出力か
④ テスト
プログラムが設計通りに動くか確認
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/GJ5544RMJ4.jpg)

プログラム設計レシピ
① 分析
名前付け，入力と出力を明らかに
名前：area，入力：なし，出力：数値１つ
② 仕様
性能機能の条件
r1 を内径，r2 を外径とするリングの面積
③例
どのようなときに，どのような出力か
r1 = 3，r2 = 5 のとき，50.24 が求まる
④ テスト
プログラムが設計通りに動くか
テスト用プログラム
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LE3NGGP9E5.jpg)

16-2. 種々のエラーとプログラム
のテスト
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/8EDW11L87G.jpg)

エラーの種類
① 構文エラー(Syntax Errors)
• 言語の書式に合っていない場合
② 実行エラー(Run-time Errors)
• プログラムが出力を出さない場合
③ 論理的エラー(Logical Errors)
• 出てきた出力が，仕様（性能機能の条件）に合致
しない場合
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/V7P9QQ2WJ8.jpg)

① 構文エラー
スペルミスで，
プログラムが
実行できない
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/2JVM55D9JQ.jpg)

実行エラーを含むプログラム
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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/5EGG66Y4EL.jpg)

③ 論理的エラー
スペルミスで，
おかしな答え
が出ている
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/4JQX44MREP.jpg)

エラーの種類ごとに発見方法が異なる
① 構文エラー(Syntax Errors)
• 言語の書式に合っていない場合
プログラムを実行させようとすると，実行できず，エ
ラーメッセージが出る
② 実行エラー(Run-time Errors)
• プログラムが出力を出さない場合
プログラムを実際に実行させる．そしてエラーメッ
セージが出たり，プログラムが「止まっている」よう
に見えたりする
③ 論理的エラー(Logical Errors)
• 出てきた出力が，仕様に合致しない場合
プログラムを実際に実行させる．そしてテストする
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/K746QQVQE1.jpg)

分野の知識(Domain Knowledge)
• プログラムを定義するには，プログラムをし
ようとする領域の知識（分野の知識）が必要．
• 音楽，交通工学，生物学，芸術 ・・・ など
プログラムしたい領域の用語，知識の理解が必要
• 「対象分野に応じてプログラム言語自体を発明
する，設計する」という考え方も（興味のある
人は「Domain Specific Language」という言葉
で調べてみること）
• コンピュータ言語のみにとらわれず，対象分野
のしっかりとした基礎の理解が不可欠．
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/LJ1VPP3LEG.jpg)

16-3. アサーション
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/GJWL22PQE2.jpg)

アサーション
• 「必ず成立しているはずのこと」を書いたものが
アサーションである．Javaでは次のように書く．
アサーションは論理的エラーの発見に役立つ
• 「x &gt;= 0」がアサーション，
• error, x &lt; 0 in area() がメッセージ
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/4EZMDDK3J3.jpg)

アサーションをエラーの発見に役立てる
間違い（エラー）を含む式
実行結果の例
アサーションがない場合，
論理的エラーを見逃しそう
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/Y76N11QZ7V.jpg)

アサーションをエラーの発見に役立てる
assert x &gt;= 0 : &quot;error, x &lt; 0 in area()&quot;;
実行結果の例
アサーションの機能により
エラーメッセージが出る
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/G75544R974.jpg)

• アサーションの機能は Java Tutor, GDB online,
Paiza.io で動かすのが難しいので，前ページの実
演のみ（演習なし）
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/9J2NVVD5ER.jpg)

16-4. 例外処理
35


# Page. 36

![Page Image](https://bcdn.docswell.com/page/DEYP3326EM.jpg)

例外処理
• 例外処理とは，不測の事態における処理
不測の事態（例外）の例
• まさか「ファイルが無い」とは
• まさか「プログラム中にバグがある」とは
• まさか「半径が負の数に設定されている」とは
• まさか「アサーションが成立しない」とは
例外処理の例
• 「ファイルを準備するように」とメッセージを出して処理
を再開
• 「正しい値を設定するように」とメッセージを出して処理
を終了
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/VJN5VVW178.jpg)

例外の
発生
例外処理
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/YE9Y66XYJ3.jpg)

Java での例外処理
• throws Exception
メソッド内で例外が発生する可能性があること
• throw new Exception
例外の発生
• try { … } catch( … ) { … }
例外処理
38


# Page. 39

![Page Image](https://bcdn.docswell.com/page/GE86ZZ2K7D.jpg)

throws Exception
「area メソッド内で，例外の発生があり
える」と宣言（コンピュータに教える）
r2 &lt; r1 は想定外なので，
例外を発生させる
例外処理
39


# Page. 40

![Page Image](https://bcdn.docswell.com/page/LEL9DD2PJR.jpg)

Java での例外処理の書き方
try {
処理
} catch(Exception e) {
例外処理
}
＜処理＞で例外が発生したときの
例外処理ができるようになる
※ 「Exception」のところは，
例外の種類を細かく指定することも可能
40


# Page. 41

![Page Image](https://bcdn.docswell.com/page/4JMZPP82EW.jpg)

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


# Page. 42

![Page Image](https://bcdn.docswell.com/page/PJR6115579.jpg)

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


# Page. 43

![Page Image](https://bcdn.docswell.com/page/PEXMYYKX7X.jpg)

関連ページ
• 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


