--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/04/08

間違え探し

via Java と Ruby の比較記事がひどい - odz buffer

やってみた。

  • RubyはJavaより単純でJavaより高速です。
    • 聞いたことない。
  • たとえば、Javaパッケージ「java.sql」をロードするには次のようにします。
    import java.sql.*;
    • 言いたいことは分かるけど、全然違う。パッケージをロードすることはできない。また、これじゃサブパッケージの import もできない。厳密には、指定パッケージ直下のclass(クラス、インタフェース、enum)をロードする、かな?。
  • try-catch-finally 節のところ。
    try {
        String url="com:mysql:jdbc://localhost:3306/test";
        Connection connection=DriverManager.getConnection(url, "root","");
    } catch (SQLException e) {
        System.err.println("Caught: SQLException: " + e.getMessage());
    } finally(){
        connection.close();
    }
    • わろた。finally に括弧は要らない。それから try 句で宣言した変数は、同じ節の finally 句からは見えない。こういうことをしたいときは、try-finally 節を二重にする。
      try {
          String url="com:mysql:jdbc://localhost:3306/test";
          Connection connection=DriverManager.getConnection(url, "root","");
          try {
              //ごにょごにょ
          } finally {
              connection.close();
          }
      } catch (SQLException e) {
          System.err.println("Caught: SQLException: " + e.getMessage());
      }
  • Java EEが、JavaによるModel-View-Controllerアプリケーション開発向けエンタープライズフレームワークであるように、Ruby on Railsは、RubyのModel-View-Controllerフレームワークです。
    • 間違いじゃないとは思うけど、言いたいことが分からない。

面白いなぁ。

スポンサーサイト

comment

by ASIP : 2008/04/10 10:02
正しくは
try {
String url="com:mysql:jdbc://localhost:3306/test";
Connection connection=DriverManager.getConnection(url, "root","");
//ごにょごにょ
} catch (SQLException e) {
System.err.println("Caught: SQLException: " + e.getMessage());
} finally {
connection.close();
}
上記の例ではtry-catchを入れ子にする必要はない。
by dewa : 2008/04/10 10:26
ASIP さんのやり方だと connection.close();
の箇所でconnectionが宣言されていないとコンパイルエラーになるので、こんな感じでうでしょう。

Connection connection = null;
try {
String url = "com:mysql:jdbc://localhost:3306/test";
connection = DriverManager.getConnection(url, "root", "");
//ごにょごにょ
} catch (SQLException e) {
System.err.println("Caught: SQLException: " + e.getMessage());
} finally {
try {
connection.close();
} catch (SQLException e) {}
}
by ASIP : 2008/04/10 10:35
先程のPOSTで間違ってたので訂正
try {
String url="com:mysql:jdbc://localhost:3306/test";
Connection connection=DriverManager.getConnection(url, "root","");
//ごにょごにょ
} catch (SQLException e) {
System.err.println("Caught: SQLException: " + e.getMessage());
}finally {
try{
connection.close();
}finally{}
}
上の例だと「ごにょごにょ」で発生した例外はエラーログに残らない。
try {
String url="com:mysql:jdbc://localhost:3306/test";
Connection connection=DriverManager.getConnection(url, "root","");
//ごにょごにょ
connection.close();
} catch (SQLException e) {
System.err.println("Caught: SQLException: " + e.getMessage());
}
でも可、finallyを使う意味はない。
by ASIP : 2008/04/10 10:41
dewaさん、入れ違いになってしまいましたが、ご指摘ありがとうございました。
by ASIP : 2008/04/10 10:56
2回目の投稿の2つめを訂正...
try {
String url="com:mysql:jdbc://localhost:3306/test";
Connection
connection=DriverManager.getConnection(url, "root","");
//ごにょごにょ
connection.close();
} catch (SQLException e) {
System.err.println("Caught: SQLException: " + e.getMessage());
} finally{
try{
if(!connection.isClosed)connection.close();
}finally{}
}
やはりfinallyは必要...コネクションは閉じないと...
by たろう : 2008/04/10 12:26
>ASIPさん、dewaさん
コメントどうもです。

議論になってる件について。というか元々は finally に括弧は要らないし、宣言する場所と閉じる場所がおかしいからコンパイル通らないよ、ってお話なんだけど。

原則として意識しなければならない点は、"開いたものは、必ず閉じなければならない" という一点です。この "必ず閉じる" という点を保障するには、finally 節で close してやるのが一番簡単かつ確実です。なので記事で紹介したようなコードになります。

close で発生する例外についても、もし発生すれば外側の catch 節で捕捉されることになります。気になるならば close する finally 節の中で try-catch してやればいいかと。個人的には、可読性の観点からやらないんですけど。

dewa さんのやり方も問題ないんですが、null 初期化が気になります。この辺は好みだと思うんですが、私は null 初期化が嫌いなので、記事のコードのようにやりました。

ASIP さんのやり方について、2回 close を書くのは不自然です。そうするくらいなら、素直に finally で close すればいいと思います。
by 通りすがり : 2008/04/11 12:53
パッケージに関しては、それ以前に「ロード」とか言って require などと比較するいうのは誤解を招くよなあと思います。別に何かを読み込むわけですし。
post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。