こうしろうのEclipseとJavaの学習はそろそろ基礎の部分を脱出しそうだ。本とWebサイトの情報を頼りに勉強を進めているので,あまり会話文のない日記になっている。私もEclipseについては,こうしろうより数週間のアドバンテージがあるだけで教えるというほどでもない。でも,たまには何か教えたほうが良いかと思い,バグが出て困ったときに教えてやろうとデバッグの方法を予習した。

 「プログラムがうまく実行できなかったら,デバッグの方法を教えるわ。」とEclipseを立ち上げたこうしろうに声を掛けた。彼のJavaプログラミングの勉強はデータベースの利用に進んでいる。

 Javaでデータベースに接続するには,JDBCドライバを利用する。日経ソフトウエア誌面の連載「プログラマのためのデータベース基礎講座」でも扱っているデータベースMySQLに接続するには,Connector/J というJDBCドライバをMySQL ABのページからダウンロードする。http://www.mysql.com/のMySQL Connectorsのリンクをたどり,Connector/Jと進み,Source and Binaries(zip) 3.1.10 6.7Mをダウンロードする。ダウンロードしたら,mysql-connector-java-3.1.10-bin.jarを適当なフォルダ,たとえば,eclipse以下のworkspaceなどにコピーしておく。

 以下はMySQLのデータベースrensyuのテーブルt_syohinからレコードセットを作成し,表示するプログラムである(全体を一気に載せると説明しにくいので,いくつかのパートに分けて掲載します)。

----------------------------------------------------------

(インポート部分)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

----------------------------------------------------------
SQL関係のクラスをインポートする。
----------------------------------------------------------

(接続とレコードセットの作成)

public class DBTest {
 public static void main(String[] args) {
  try {
   Class.forName("com.mysql.jdbc.Driver");
   Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/rensyu","user01","user01"); 
    Statement st = conn.createStatement();
    ResultSet rs = 
    st.executeQuery("select shname,kigou,tanka from t_syohin");    

----------------------------------------------------------
 Class.forNameでJDBCドライバを読み込む。DriverManager.getConnectionがデータベースへの接続だ。localhostは自機を表す。3306はポート番号,rensyuはデータベース名,続いて,ユーザー名とパスワードをuser01,user01と指定している(パスワードがユーザー名と同じなのは手抜きである。本当は,こんなパスワードを付けてはいけない)。Statementオブジェクトは静的なSQL 文を実行し,作成された結果を返す。MySQLが起動していない場合や他の理由でデータベース接続できないことが考えられるので,try ~ catch構文を使う。
----------------------------------------------------------

(レコードの表示と切断処理)

    while(rs.next()) {
     String name = rs.getString(1);
     String kigou = rs.getString(2);
     String tanka = rs.getString(3);
     System.out.println
         ("商品名:"+name+" 記号:"+kigou+" 単価:"+tanka+"円");
    }      
    rs.close();
    st.close();
    conn.close(); 
    System.exit(0);

----------------------------------------------------------
 作成したレコードセット(rs)のフィールド値を取得し,表示した後,レコードセットや接続を閉じている。どんなプログラム言語でも,データベースへの接続-レコードセットの取得-接続の切断という手順には変わりはない。
----------------------------------------------------------

(例外処理)

  } catch (ClassNotFoundException e) {
    System.out.println("ドライバを読み込めませんでした "+ e);
  } catch (SQLException e) { 
    System.out.println("データベース接続エラー "+ e);
  }
 }
}

----------------------------------------------------------
 例外をcatch でつかまえて,エラーメッセージを表示する。JDBCドライバが読み込めなかったときは,例外ClassNotFoundExceptionが発生する。それ以外の場合は,SQLExceptionが発生する。

 このプログラムをこのまま実行すると,ClassNotFoundException が発生する。先ほど適当なフォルダにコピーしたmysql-connector-java-3.1.10-bin.jarのありかがわからないからだ。クラス・パスを設定すれば正しく実行できるようになる。

実行ダイアログで,クラスパスタブを選択し,外部JARの追加でmysql-connector-java-3.1.10-bin.jarを登録すれば,実行できるようになる。
----------------------------------------------------------

(実行結果)

商品名:USBメモリ128 記号:USBM 単価:2400円
商品名:USBメモリ256 記号:USBM 単価:3500円
商品名:USBメモリ512 記号:USBM 単価:5000円
商品名:SDメモリカード128 記号:SDMC 単価:2300円
商品名:SDメモリカード256 記号:SDMC 単価:4900円
商品名:SDメモリカード512 記号:SDMC 単価:5400円

----------------------------------------------------------
 さて,デバッグの使用方法に進もう。まず,パースペクティブをデバッグに切り替える。

 プログラムの調べたい部分か,チョイ前にブレークポイントを仕掛ける。行の左端をダブルクリックすると水色の点が表示される。ここがブレークポイントになる。虫(Bug)のボタンを押すとプログラムが開始され,このブレークポイントで一旦停止する。

 ここでステップインやステップオーバーのボタンを押すと,プログラムをステップごとに実行できる。ステップインは各メソッドの中に入って行き,1ステップずつ実行する。ステップオーバーはメソッドを一気に実行する。右上の変数ビューには,メンバー変数のプロパティが表示される。

 デバッグを使えば,ステップごとに処理を行い,どこでエラーが発生したのか,その時のメンバー変数の値はどうだったのかを調べることで,プログラムのテストを効率化できる。