質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3692閲覧

外部JARのメソッド実行時で必ずFinallyへ飛んでしまう場合に考えられること。

Cafelike

総合スコア89

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2015/12/19 08:26

編集2015/12/21 01:10

お世話になります。
外部JARの提供を受け、それを使用してプログラムを作成しています。
参照の設定を行い、いざメソッド実行とまで来たのですが、
そのメソッドを実行するとエラーとなりcatchへ飛ぶわけではなく、後続の処理が実行されるわけでもなく、try句のFinallyへ飛んでしまいます。

このようにFinallyに飛んでしまう場合、
どのような原因が考えられますでしょうか?
推測でも構いませんのでよろしくお願いいたします。

追記:
情報不足でした。すいません。
eclipse4.2、JRE1.6でステップ実行した結果となります。
JRE1.8に変更して実行しても同様の現象でした。

JAVA

1 2try{ 3 double[] xx=new double[x.size()]; 4 double[] yy=new double[y.size()]; 5 6 //省略(配列にパラメータをセットするなど) 7 8 jp.hoge.hoge.Smoother.smooth(xx,yy);//実行すると処理がFinallyへ移動す 9 10 //省略(変換された配列をDB登録するなど) 11 12catch (Exception e) 13{ 14 //例外発生 15 throw e; 16} 17finally 18{ 19 //★★★処理がここに移る。★★★ 20

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2015/12/19 08:35

IDEでデバッグして、ステップ実行してということでしょうか?その辺の詳細を書いていただけると助かります。
guest

回答3

0

ベストアンサー

Exceptionのクラス階層を見てみてください。Throwableを継承していることが解ると思います。

Throwableクラスは、Java言語のすべてのエラーと例外のスーパー・クラスです。このクラス(またはそのサブクラスの内の1つ)のインスタンスであるオブジェクトだけがJava仮想マシンによってスローされるか、Javaのthrow構文によってスローされます。

というわけで、Throwableを継承しているがExceptionは継承していないようなクラス(これも上記ページを見るとわかりますが、例えば標準ライブラリにあるものではError継承クラス)がthrowされているのでしょう。

catch (Exception e) の代わりに catch (Throwable e) とすることでcacthできます(ただしここでcatchするのが正しいとは限りません。上に記載したリンク先等を読んで判断してください)。

投稿2015/12/19 08:54

編集2015/12/19 08:58
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cafelike

2015/12/21 00:54

回答ありがとうございます。 catch (Throwable e) を追加して、何が起きているのかを知ることができれば対処も見えてくるのではと思いました。実際に試して確認してみます。 確認できましたら追記いたします。
Cafelike

2015/12/21 01:26

Throwableでキャッチできました。原因は以下が発生していることによりました。 java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0 JAVAのバージョン違いによるものだとわかりましたので解決に進めそうです。 どうもありがとうございました。 また、質問がわかりづらい書き方であったことで、 みなさんに誤解を与えてしまったことをお詫びいたします。
guest

0

finallyは例外が発生しようがしまいが、必ず実行されるブロックです。

投稿2015/12/19 10:31

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cafelike

2015/12/20 23:50

回答ありがとうございます。 それは承知しております。 上記のケースで考えられる要因を知りたいです。
swordone

2015/12/21 00:29

つまり、省略されてる部分を飛ばしてfinallyに飛んでいる理由ということですか?
Cafelike

2015/12/21 00:48

そうです、ただ、なんらかエラーが発生していてそれがキャッチできていないのであれば自然な動作と思えます。 まずは、yukihaneさんの回答にあるようにThrowableで何が起きているかを調査してみたいと思います。
guest

0

finallyはcatchに飛ぼうが飛ばなかろうが実行されるのだと思います。

http://www.atmarkit.co.jp/ait/spv/0611/22/news145.html

投稿2015/12/19 09:04

編集2015/12/19 09:06
jinco

総合スコア432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cafelike

2015/12/20 23:50

回答ありがとうございます。 それは承知しております。 上記のケースで考えられる要因を知りたいです。
jinco

2015/12/21 00:27

誤解してたらすみません。。 finallyはtry後に必ず実行したいコードを書くところなので、実行されるのは当然なのだと思います。 例えば外部とのやり取りの後、必ずコネクションを閉じる処理を行いたいといった時に使うはずですが。。
Cafelike

2015/12/21 00:51

コードを省略しすぎて誤解を招いたのかもしれません。 エラーが起きたとかでなければ普通は以降の処理が実行されるものと思いますが、 今回、この外部JARにあるメソッドを呼び出すことで、エラーするわけでも、後続の処理が実行されるわけでもなく、Finallyへ処理がうつるという動作に疑問をもっています。
jinco

2015/12/21 01:35

なぜ後処理が実行されずにfinallyに飛ぶのか、という話だったんですね。質問をよく理解しておらず失礼しました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問