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

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

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

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

2回答

3205閲覧

ラムダ式の中で発生する実行時例外のスタックトレースが表示されない

yohira0616

総合スコア257

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2016/07/25 03:21

編集2016/07/25 03:28

Java8のラムダ式内で発生した実行時例外のスタックトレースが表示されない場合があるのですが、発生条件がいまいちわかりません。

プロダクトコード
例外が発生するDaoクラス
発生するのはRuntimeExceptionのサブクラスであるIncorrectResultSizeDataAccessException。
idに対応するレコードが0件のとき発生します。

Java

1@Repository 2public class SomeDao implements SomeDaoSpec { 3 4 @Autowired 5 private NamedParameterJdbcTemplate template; 6 7 private static RowMapper<Something> rowMapper = (rs, i) -> { 8 Something result = new Something(); 9 //ResultSetからオブジェクトに値を詰める処理 10 return result; 11 }; 12 13 private static final String FIND_ONE_SQL = "SELECT * FROM something WHERE id=:id"; 14 15 @Override 16 public Something findOne(String id) { 17 return template.queryForObject(FIND_ONE_SQL, 18 new MapSqlParameterSource().addValue("id", id), rowMapper); 19 }

Serviceクラス

java

1 2@Service 3public class SomeService implements SomeServiceSpec { 4 5 @Autowired 6 private SomeSpec someDao; 7 8 @Override 9 public List<Some> getSomes(List<String> ids){ 10 //何かする 11 List<Some> result=Lists.newArrayList(); 12 ids.stream().forEach((id)->{ 13 result.add(someDao.findOne(id)); //ここで本来なら、daoクラスが例外を投げるのでスタックトレースが出るはず 14 }); 15 } 16} 17

Controllerの戻り値として500が返ってきているので、実行時例外が発生しているのはわかりますが、そのスタックトレースが表示されません。

検証用コード

Java

1public class Exec { 2 3 public static void main(String[] args) { 4 System.out.println("start..."); 5 getIns().ifPresent((obj) -> { 6 obj.throwErr(); 7 }); 8 System.out.println("end"); 9 10 } 11 12 private static Optional<Obj> getIns() { 13 return Optional.of(new Obj()); 14 } 15 16} 17 18class Obj { 19 20 public void throwErr() { 21 throw new RuntimeException("error!"); 22 } 23 24} 25

「もしかしてラムダ式の中で発生する実行時例外はすべてスタックトレースが表示されないのか?」
ということを検証するために上記の検証用コードを実行すると、これはスタックトレースがきちんと表示されます。

ラムダの中で発生する実行時例外のスタックトレースが表示されない状態の再現条件がわからないので、知っている方回答をよろしくお願いいたします。

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

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

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

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

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

argius

2016/07/25 10:39

特にラムダ式だからスタックトレースが出ないということは無いとは思うんですけど、現状でははっきりしたことは分かりません。 Spring4.3.1で、似たような状況を作って実行してみましたが、例外の種類は違いますがorg.springframework.dao.EmptyResultDataAccessExceptionという例外が出て、スタックトレースもTomcatのエラー画面も出ました。 Springのバージョンや、アプリケーションサーバーの種類、などなど、他に考えられる発生条件に付いて教えていただけますか?
guest

回答2

0

そもそも、スタックトレースが表示されるのは

  • 例外に対してprintStackTrace()を実行した場合
  • 発生した例外がキャッチされず、JVMに到達した場合(強制終了)

このいずれかになります。

Controllerの戻り値として500が返ってきている

ということは、内部で例外がキャッチされて返り値を出しているという意味ではないでしょうか?

投稿2016/07/26 02:12

swordone

総合スコア20651

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

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

0

記載していただいたソースコードならびにMySQLとSpringBoot+JDBCTemplateの環境(SpringBootは1.3.6)で検証しましたが、レコードを取得できないときにスタックトレースが出ないことはありませんでした。

念のためですが

「result.add(someDao.findOne(id)); //ここで本来なら、daoクラスが例外を投げるのでスタックトレースが出るはず」に到達しているのか、ブレークポイントを設定し、デバッグモードでこの行で停止するかを確認されてはいかがでしょうか。

投稿2016/07/25 15:00

A-pZ

総合スコア12011

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問