Javaにおけるエラー処理(例外処理)


Javaにはtry ~ catch文を用いて例外処理(エラー処理)を行うことが可能です。
基本フォーマットは以下のようです。

try{
実行する文1;
実行する文2;
実行する文3;
} catch (例外クラス 変数名)
{
例外が発生した時に実行する文;
}

try{}内でエラーが発生したらcatch内の変数に向けて例外オブジェクトがthrowされます。
下のプログラムはシンプルな実装例で



######################################################

// Exception.java

//Consoleクラスを呼び込む
import java.io.Console;

public class Exception {
    public static void main(String[] args) {
// int型の変数を宣言
        int input;
//Consoleクラスを使用する準備
        Console console = System.console();
        System.out.println("数字を入力してください。");
//例外処理。try内でエラーが出たら、例外オブジェクトをthrowする
            try {
                input = Integer.parseInt(console.readLine());
//例外オブジェクトをキャッチ
            } catch(NumberFormatException e) {
                System.out.println("エラー");
System.out.println("例外オブジェクトの中身は:" + e);
            }
}
}
######################################################

########テスト##########
$ java Exception 

数字を入力してください。
2


$ java Exception
数字を入力してください。
hoge
エラー
例外オブジェクトの中身は:java.lang.NumberFormatException: For input string: "hoge"

###########################



IntegerクラスのメッソドであるparseIntの仕様については以下のサイトで検索することができます。





【参考文献】
丸の内とら『Java入門教室』SE SHOEISHA 2012 126-134pp

Consoleクラスを使ったデータの受け取り(クラスの読み込みの実例)


Consoleクラスを用いて、ユーザー側から文字入力を受け取るプログラムです。
Consoleクラスのメソッド及びそれぞれの例外処理に関しての情報は下記のサイトにのっています。

Consoleクラスはフルネームは"java.io.Console"と言います。"java.io"部分はパッケージ名です。このページには、ConsoleクラスのMethodについて記述がされています。クラスによっては、このページにメソッドだけでなくフィールドについても記載されています。

Consoleクラスに実装されているreadLineメソッドの仕様を眺めてみます。

java.ioパッケージに含まれるようなので、java.ioパッケージに含まれるClassのSummaryを眺めてみます。



SystemクラスやStringクラスの代表されるJava Core APIライブラリの代表的クラスの場合は、デフォルトでimportされるので、明示的にimportする必要はありません。一方、Consoleクラスなどのその他一般のクラスを利用しようと考えた場合は、その都度クラスをimportする必要があります。

#ソースコードの編集
$ vim aisatsu.java

// aisatsu.java
//Consoleクラスのimport
//Consoleクラスを利用すると、CUIでの有用なインターフェースが提供される
import java.io.Console;
public class aisatsu{
 public static void main(String[] args){
  //変数の宣言
  String name;
  //Consoleクラスを使用するための準備
  Console console = System.console();
  System.out.println("Input your name, please.");
  //ユーザーの入力を取得して、変数に代入する。
  //Consoleクラスのメソッド(readLine)を呼び出す
  name = console.readLine();
  System.out.println("Hello, " + name);
 }
}

#コンパイルしてテスト
$ java aisatsu
Input your name, please.
Kappa
Hello, Kappa



上のソースコードでは、文頭に"import java.io.Console"と宣言することで、Consoleクラスをimportしていました。import文を書かなくても、"java.io.Console"のようにパッケージ名とクラス名を合わせて指定することで、ソースコード内でクラスを参照することもできます。


// aisatsu.java
public class aisatsu{
 public static void main(String[] args){
  //変数の宣言
  String name;
  //Consoleクラスを使用するための準備。
  //パッケージ名とクラス名を書く。
  java.io.Console console = System.console();
  System.out.println("Input your name, please.");
  //ユーザーの入力を取得して、変数に代入する。
  //Consoleクラスのメソッド(readLine)を呼び出す
  name = console.readLine();
  System.out.println("Hello, " + name);
 }
}


【参考文献】
丸の内とら『Java入門教室』SE SHOEISHA 2012 75-83pp

1998年に、Wattsとその指導教員のStrogatzは本格的な複雑ネットワーク研究の幕開けとなる論文を発表しました。
彼らのモデルは、平均次数を大きくしすぎずに、小さい平均距離(L)と大きいクラスター係数(C)を同時に達成するネットワーク、すなわち、スモールワールド・ネットワークとなるものです。

WSモデルの作り方
(1)平均頂点Nと平均次数<k>を定める。<k>は偶数とする。
(2)拡張サイクルを作る。すなわち、頂点N個を輪状に置き、拡張点を輪の右隣<k>/2個までの頂点と隣接させる。拡張点の次数は<k>となる。
(3)枝は合計<k>N/2ある。そのうち、割合p(0=<p=<1)だけの枝、つまりp<k>N/2本を選ぶ。各枝は等確率で選ばれるとする。
(4)選んだ枝のそれぞれについて、片方の端点とはつないだままにして、もう片方の端点から切り離す。どちらの端点を切り離すかは半々の確率で決める。
(5)宙に浮いた各枝の新しい端点をネットワーク全体の中から等確率に1つ選び、枝を作る。この操作をつなぎかえ、新しい枝を近道またはショートカットと呼ぶ。新しい端点を選ぶときには、
(ⅰ)ループと多重辺を避け
(ⅱ)元の拡張サイクルの枝を復元してしまうような頂点をさける
こと。



####### RでWSモデルのシュミレーション############

####レギュラーグラフ(拡張サイクル)の作成関数の定義#####
regular.g <- function(n, k){
reg <- matrix(0, n, n)
for(i in 1 : n){
for(j in 1 : k){
if(i + j <=n)
reg[i, i+j] <- 1
else
reg[i, i+j-n] <- 1
}
}
(reg <- symmetrize(reg))
}
#######################################

#regular.g関数のテスト
test.g <- regular.g(20,4)

#グラフの描写
library(sna)
png("regular.png")
gplot(test.g, gmode="graph", mode="circle", main="Regular graph (n=20, k=4)")
dev.off()

#pを変化させて辺の架け替えを行う

g <- regular.g(20,4)

#p = 0
rew.g1 <- rewire.ws(g, 0)

#p = 0.2
rew.g2 <- rewire.ws(g1, 0.2)

#p = 1.0
rew.g3 <- rewire.ws(g1, 1.0)

#図示
png("ws1.png")
gplot(rew.g1, gmode="graph", mode="circle", main="p = 0")
dev.off()

png("ws2.png")
gplot(rew.g2, gmode="graph", mode="circle", main="p = 0.2")
dev.off()

png("ws3.png")
gplot(rew.g3, gmode="graph", mode="circle", main="p = 1.0")
dev.off()
pが小さいうちはレギュラーグラフに類似した構造で、p値を大きくするとランダムグラフに近づくことが定性的に理解することができます。

それでは、クラスター係数、平均距離、そして次数分布はpの値の変化に伴ってどのように変化しているのでしょうか。以下では、これらの値を計算し、可視化を行います。





【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp
増田直紀 今野紀雄『複雑ネットワーク』2010 近代科学社  83-86pp

オブジェクト指向プログラミングの基本用語


オブジェクト指向型プログラミングに関する各種用語の整理を行いました。大部分は、文末に挙げた参考文献に依拠しています。

#手続き型言語
  • C, Pascal, BASICなど
  • 編成単位が原始的
  • データの扱いが大雑把(local, globalの2種類よりも細かく柔軟性のある指定ができない)
  • アクセスしてはいけない関数からの不注意なアクセスというプログラミングエラーが頻繁に起きる
  • そのデータにアクセする必要な視覚のある関数だけがアクセスできて、ほかからはデータが見えないようにするにはオブジェクト指向型言語が必要
#オブジェクト指向型言語
  • OPP :  object oriented programming
  • 関数と変数の両方をおさめたプログラミング単位:オブジェクト を規定
  • C言語の構造体をヒントに拡張した
#オブジェクト
  • フィールド:オブジェクトの中の変数
  • メソッド:オブジェクトの中の関数
  • 無関係なメソッドや行儀の悪いメソッドがあるオブジェクトのフィールドにアクセスができないようになっている。
#クラス
  • 形はまったく同じでもメソッドの処理内容やフィールドの内容が少しずつ違うオブジェクトをいくつも作成するのは手間がかかる。
  • クラスという概念は、一定の形をしたオブジェクトの仕様書みたいなもの。
#オブジェクトの作成
  • クラスの定義を書いただけでは、そのクラスのオブジェクトは作られない
  • C言語の構造体でもやはり、構造体の定義をかいただけでは何も変数は作られない
  • newというキーワードを使ってオブジェクトを生成
  • オブジェクトの生成と同時に、そのオブジェクトの参照を、そのオブジェクトのクラス型指定としてついている変数に収める必要がある
  • 実際にクラスからオブジェトを作成することをインスタンス作成(instantiation)という
  • オブジェクトのことを「クラスのインスタンス」ということがある。
#オブジェクトのメッソドへのアクセス
  • "."を用いてオブジェクトとそのメソッドやフィールを結びつける
               例  object.field    object.method
#コンストラクタ
  • コンストラクタはnewを用いてオブジェクトを作るときに、自動的に呼び出さる。
  • コンストラクタの名前は常にクラスの名前と同じ
  • コンストラクタの中には、オブジェクトが最初に作られた時の状態や、その時に行われるべき操作などが書かれる。
  • コンストラクタがないと、不必要に多いメソッドを作ってしまうことになる
#publicとprivate
  • publicとprivateはアクセス指定(access modifier)と呼ばれる
  • クラスのメソッドやフィールドに外からアクセスできるか・できないかを指定する
  • privateが付いているフィールやメソッドは、そのクラスの中のメソッドからしかアクセスできない
  • publicが付いているフィールドやメソッドは、その他のクラスから呼び出すことができる
#クラスのフィールド(つまりデータ)は、通常はprivateにして、メソッドの方をpublicにする
  • このようにすることで、他のクラスのメソッドが断り無く勝手にデータを書き換えたりできないので、データが保護される。
  • 外部からのクラスのデータにアクセスする必要があったら、必ずそのクラスのメソッドを使うようにすることができる
  • 『データは女王蜂のみたいなものです。巣の奥深くに隠しておいて、働き蜂のメソッドたちに世話をさせるのです。』
#継承(inheritance)
  • 既存のクラスから派生させたクラスとして、既存のクラスの拡張版のような新しいクラスを作ること
  • 元のクラスをスーパークラス(super class)と呼ぶ
  • 新たに定義されるクラスをサブクラス(subclass)と呼ぶ
  • スーパークラスからサブクラスを作ることは拡張(extend)していることに等しい。そのため、キーワードはextendを使用
  • 既存のクラスに新たな特徴を加えることが容易にできるし、元となる1つのクラスを軸として関連クラスの集まりを定義できるので、設計の点で有利である
#多形性(polymorphism)
  • 多形性とは、クラスがそれぞれ異なる複数のオブジェクトに対して、同じ取り扱いができる状態のこと
  • それらの異なるクラスは、同一のクラスからのサブクラスでなけれbならない
  • クラスが異なる複数のオブジェクトに対して、同じ名前のメソッドを呼び呼び出せるが、そのメソッドの処理内容が少しずつ違う状態のことをpolymorphismと呼ぶ
  • 柔軟で臨機応変な取り扱いを自動的に行うこと
  • 多形性はプログラムの設計とコーディングを単純化し、わかりやすくする
#ソフトウェア工学
  • ソフトウェアの全生涯には、仕様決定、設計、審査、コーディング(狭義のプログラミング)、試験、生産、メンテナンスが含まれる
  • ソフトウェア工学そのものは抽象的な学問なので、大規模なプロジェクトを実際に体験した人でないと具体的な理解が難しい
【参考文献】

Robert Lafore 著 岩谷 宏訳 『Javaで学ぶアルゴリズムとデータ構造』ソフトバンク 1999 8 - 16 pp

Javaアプレットのビュア

作成したJava appletの出来映えを確認したい場合は、appletviewerというコマンドを使用します。
例として、Javaでアプレットを使用しながらアルゴリズムを学べる『Javaで学ぶアルゴリズムとデータ構造』という本 (http://www.sbcr.jp/products/4797306947.html) に付属するサンプルを閲覧してみます。


$ appletviewer ~/Javaで学ぶアルゴリズムとデータ構造/DSA/JAVAAPPS/JAVA-1.1/Chap02/Array


一昔前のJavaだと、Chromeなどのブラウザでは付属のアプレットが動かないことがしばしば見られます。Webブラウザが対応していないためです。そのためApplet Viewerは重宝されます。


【参考文献】
Robert Lafore 著 岩谷 宏訳 『Javaで学ぶアルゴリズムとデータ構造』ソフトバンク 1999