質問編集履歴

1 fix typo

yohira0616

yohira0616 score 255

2016/07/25 12:28  投稿

ラムダ式の中で発生する実行時例外のスタックトレースが表示されない
Java8のラムダ式内で発生した実行時例外のスタックトレースが表示されない場合があるのですが、発生条件がいまいちわかりません。
プロダクトコード
例外が発生するDaoクラス
発生するのはRuntimeExceptionのサブクラスであるIncorrectResultSizeDataAccessException。
idに対応するレコードが0件のとき発生します。
```Java
@Repository
public class SomeDao implements SomeDaoSpec {
 @Autowired
 private NamedParameterJdbcTemplate template;
 private static RowMapper<Something> rowMapper = (rs, i) -> {
   Something result = new Something();
   //ResultSetからオブジェクトに値を詰める処理
   return result;
 };
 private static final String FIND_ONE_SQL = "SELECT * FROM something WHERE id=:id";
 @Override
 public Something findOne(String id) {
   return template.queryForObject(FIND_ONE_SQL,
       new MapSqlParameterSource().addValue("id", id), rowMapper);
 }
```
Serviceクラス
```java
@Service
public class VoiceService implements VoiceServiceSpec {
public class SomeService implements SomeServiceSpec {
 @Autowired
 private SomeSpec someDao;
 @Override
 public List<Some> getSomes(List<String> ids){
   //何かする
   List<Some> result=Lists.newArrayList();
   ids.stream().forEach((id)->{
      result.add(someDao.findOne(id)); //ここで本来なら、daoクラスが例外を投げるのでスタックトレースが出るはず
   });
 }
}
```
Controllerの戻り値として500が返ってきているので、実行時例外が発生しているのはわかりますが、そのスタックトレースが表示されません。
検証用コード
```Java
public class Exec {
 public static void main(String[] args) {
   System.out.println("start...");
   getIns().ifPresent((obj) -> {
     obj.throwErr();
   });
   System.out.println("end");
 }
 private static Optional<Obj> getIns() {
   return Optional.of(new Obj());
 }
}
class Obj {
 public void throwErr() {
   throw new RuntimeException("error!");
 }
}
```
「もしかしてラムダ式の中で発生する実行時例外はすべてスタックトレースが表示されないのか?」
ということを検証するために上記の検証用コードを実行すると、これはスタックトレースがきちんと表示されます。
ラムダの中で発生する実行時例外のスタックトレースが表示されない状態の再現条件がわからないので、知っている方回答をよろしくお願いいたします。
  • Java

    24141 questions

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

  • Spring

    1413 questions

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

  • Spring Boot

    1646 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る