- ベストアンサー
Oracleに接続すると、それ以降の処理を素通りしてしまう
下記のようなメソッドで<1><2>の後、すぐに<7>に処理をしてしまいます。 <1>~<7>と動くと思っていたのですが、<3>~<6>が全て無視されます。 どこか問題があるのでしょうか? ちなみに、<1>で無効なURLを指定するとSQLExceptionでcatchされます。 try { Class.forName("oracle.jdbc.OracleDriver"); try { //<1> conn = DriverManager.getConnection (URL, UID, PSW); //<3> System.out.println("Oracleと接続しました"); } catch (SQLException e) { System.out.println("oracle接続エラー"); } catch (Exception e) { System.out.println("oracle接続エラー"); } //<4> try { //<5> stmt = conn.createStatement(); //<6>sql文の作成 // select文の実行 //(略) } catch (Exception ex3) { System.out.println("なんかエラーです"); } } catch (Exception e){ System.out.println("その他エラーです"); //<2> } finally { //特になし } //<7> return list;
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#4です。 もっと下の方のメッセージが必要です。 それで、問題となっているクラスのどこでErrorが発生しているのかがわかるはずです。 そのあたりのメッセージを記述して下さい。
その他の回答 (5)
- Topica
- ベストアンサー率0% (0/1)
//1を囲むExceptionにRuntimeExceptionを入れてもcatchできませんか? //3に行ってないのは確実、でCatchもされない、ってことで 思いついたのはこのくらいなんですが。
- ngsvx
- ベストアンサー率49% (157/315)
ちょっと考えられないような実行のしかたですね。 Exceptionでキャッチできないということは、Errorが発生しているのかもしれません。 (だけど、Errorならメッセージがでるはずだし???) ちょっと試して欲しいのですが、try文を一番外だけにして、キャッチは }catch(Throwable e){ e.printStackTrace(); } finally{ System.out.println("終了"); } として実行してみてもらえないでしょうか。 おかしな動作があれば、これでわかると思います。
補足
皆様、重ね重ね、誠にありがとうございます。 トレースを取ると下記メッセージでした。 LinkageErrorが出ているとのことです。 CharacterConvertersの記述に関してはWebにもあまり出てこないようで、なぜここで?というのが理解できずにおります。 ↓ 05/08/16 16:12:44 java.lang.LinkageError: Class oracle/sql/converter/CharacterConverters violates loader constraints 05/08/16 16:12:44 at java.lang.ClassLoader.defineClass0(Native Method) 05/08/16 16:12:44 at java.lang.ClassLoader.defineClass(ClassLoader.java:537) 05/08/16 16:12:44 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) 05/08/16 16:12:44 at com.evermind.util.OC4JSecureClassLoader.defineClassEntry(OC4JSecureClassLoader.java:172) 05/08/16 16:12:44 at com.evermind.naming.ContextClassLoader.defineClass(ContextClassLoader.java:1170) ・・・(略) また、例えば 下記のメソッドを追加して、 public static void main(String[] args) { 問題のクラス win = new 問題のコンストラクタ(); try{ ArrayList list = win.問題のメソッド("引数"); } catch (SQLException e){ } catch (Exception e){ } として無理やり実行してみても、正常に動作します。 (勿論本来の使い方ではありません) なので、Oracleの接続自体に問題はないと思っているのですが・・・ どこかちょっとしたミスをしていると思うのですが・・・
- Bonjin
- ベストアンサー率43% (418/971)
どうでもいいですけど、 コネクションが取得できないのに処理を続けるのはいかがなものかと・・・
補足
ありがとうございます。 もちろんコネクションが取得できなければ処理を中断したいのですが、 正常に取得できたのか異常なのかが判断できないでおります。 異常ならcatchして欲しいのですが、 try~ ・ドライバと接続 ・コネクションを取得 ・SQLを発行 catch~ ・エラー処理 finally のなかで、コネクションを取得でcatchされないのにSQLを発行する処理を飛ばしてメソッドが終了してしまうので困っております。
- ngsvx
- ベストアンサー率49% (157/315)
ついでに、Class.forNameの前後にもメッセージを入れて、 実行した結果を正確に記述してください。 どのような手順で実行されているかわからないと、何とも言えないです。
補足
ありがとうございます。 質問時の文字数制限がありましたのでこの部分は省略していたのですが、 実は (略) Class.forName("oracle.jdbc.OracleDriver"); System.out.println("ドライバを立ち上げました"); (略) と記述しておりました。 "ドライバを立ち上げました"が出力されたのは確認できております。
- Dooon
- ベストアンサー率20% (36/180)
まず<1>~<7>と動くことはありません。 (<2>がエラールーチン内にあるため) で、<1><2><7>の処理ということがわかっているので "その他エラーです"は出力されているのですね。 「<1>で無効なURLを指定するとSQLExceptionでcatchされます。」とありますが、 これが原因ということはないのでしょうか?
補足
ありがとうございます。 無効なURLを指定するとSQLExceptionでcatchされますが 有効なURLを指定すると<2>に進んだあと、メソッドを終了します。 finally句を外すと、いきなりメソッドを終了します。 "Oracleと接続しました"というメッセージは出力されません。 といって、catchされることもありません。 "その他エラーです"も出力されません。 DriverManager.getConnection指定は他のメソッドでも同じ指定をしており、 今回も同じ環境で使用しているので、この指定自体が間違っているとは考えにくいのです。 「他のメソッド」は今でも正しく動きますので・・・ 指定方法ですが、 jdbc:oracle:thin:@(ホスト):(ポート):(SID) のうち、ホスト、ポート、SIDの何れかを架空の指定をした場合、SQLExceptionでcatchされます。 "jdbc:oracle:thin:"の記述を"dbc:oracle:thin:"などのようにわざと記述ミスした場合、 今回のようにエラーをcatchせずにすぐに終了します。
お礼
ngsvx様 お世話になります。goo_no_kaiinです。 メッセージ自体全部お出しするのはさすがに許可が下りませんでした。 こちら、JDeveloperで開発しているのですが、プログラム自身の問題ではなく、その中の設定だったようです。 java.lang.LinkageErrorについて検索してみると、 orion-web.xmlの記述を調べるように書かれておりました。 ↓ http://otndnld.oracle.co.jp/software/products/jdev10g/905_trial/readme.html そこには、 orion-web.xmlファイルで、<web-app-class-loader search-local-classes-first="true"/> が記述されている場合は、そのエントリを削除します。 と書かれてあったのですが、それでうまく実行することができました。 なぜそうなるのか?は今後調査していくことに致します。 皆様ありがとうございました。