2016-12-16 20 views
4

私はJava 8ストリームを使用しています。ストリームのforeach内で例外をスローすることはできません。java 8ストリーム内で例外をスローするforeach

stream.forEach(m -> { 
     try { 

      if (isInitial) { 
       isInitial = false; 
       String outputName = new SimpleDateFormat(Constants.HMDBConstants.HMDB_SDF_FILE_NAME).format(new Date()); 
       if (location.endsWith(Constants.LOCATION_SEPARATOR)) { 
        savedPath = location + outputName; 
       } else { 
        savedPath = location + Constants.LOCATION_SEPARATOR + outputName; 
       } 
       File output = new File(savedPath); 
       FileWriter fileWriter = null; 
       fileWriter = new FileWriter(output); 
       writer = new SDFWriter(fileWriter); 
      } 

      writer.write(m); 

     } catch (IOException e) { 
      throw new ChemIDException(e.getMessage(),e); 
     } 

    }); 

、これは私が上位レベルのエラーをログに記録するロガーを使用しています

public class ChemIDException extends Exception { 
public ChemIDException(String message, Exception e) { 
    super(message, e); 
} 

}

私の例外クラスです。だから私は例外を上に投げたい。おかげ

enter image description here

+1

私が見ることができるコードから、ストリームの代わりに 'for'ループを使用する必要があるようです。あなたは、機能的な環境に命令的なコードを置こうとしています。 – 4castle

+0

私は大きなファイルを読んで、いくつかの要素を別のファイルに書きたいと思っています。ここで私がやっていることはフィルターでファイルを読むことです。だから私は最善の方法はストリームを使用することだと思うでしょう –

答えて

2

ではなくRuntimeExceptionを拡張してみます。 foreachにフィードするために作成されたメソッドは、その型をスロー可能として持たないため、実行時にスロー可能なものが必要です。

警告:これはおそらく非常に良いアイデア

はありませんが、それはおそらく動作します。

+0

なぜそれは悪い考えではなく、代わりに彼らが足で自分自身を撃つのを続けるのを助けることを説明する必要があります。 – 4castle

+0

返信いただきありがとうございます。しかし、専用の例外を投げるのではなく、包括的な例外を投げるのは良いですか? –

+0

私が推奨している 'RuntimeException'の拡張を投げられない理由はありません。また、 'foreach'の周りで例外を確実に捕まえることを確認した場合、実行の最上位にバブルする驚くべきエラーに対してあなたは守られます。 – PaulProgrammer

0

は、なぜあなたは、あなたがしたいすべてが、最初要素を処理するときに、すべてのの要素を処理するために設計された方法をforEach使用していますか? forEachが仕事のための間違った方法であることを理解する代わりに(forEachよりもStream APIに多くのメソッドがあります)、これをisInitialフラグでkludgingしています。

だけで考えてみます。例外処理では問題がありません

Optional<String> o = stream.findFirst(); 
if(o.isPresent()) try { 
    String outputName = new SimpleDateFormat(Constants.HMDBConstants.HMDB_SDF_FILE_NAME) 
         .format(new Date()); 
    if (location.endsWith(Constants.LOCATION_SEPARATOR)) { 
     savedPath = location + outputName; 
    } else { 
     savedPath = location + Constants.LOCATION_SEPARATOR + outputName; 
    } 
    File output = new File(savedPath); 
    FileWriter fileWriter = null; 
    fileWriter = new FileWriter(output); 
    writer = new SDFWriter(fileWriter); 
    writer.write(o.get()); 
} catch (IOException e) { 
    throw new ChemIDException(e.getMessage(),e); 
} 

を。この例では、Streamの要素タイプがStringであることを前提としています。それ以外の場合は、Optional<String>タイプを適合させる必要があります。しかし、あなたのisInitialフラグはストリーム処理中に複数回変更することになって、場合


、あなたの仕事のための間違ったツールを使用して間違いです。 Streamsを使用する前に、“Non-interference” sectionと同様に、Stream APIドキュメントの“Stateless behaviors” and “Side-effects” sectionsを読んで理解しておく必要があります。ストリームの呼び出しをforEach呼び出しに変換しても、コードは改善されません。

+0

ここでは、ブロック内のisInitial内部の指定された場所にファイルを作成し、作成したファイルにstreamの各要素を書き込んでいます。 –

+0

ファイルisInitialを作成した後はfalseになり、残りの行を実行します。 –

+0

私はストリームの最初の要素を書きたくありません。私はすべてを書きたい。私はあなたが私の質問を誤解していると思います。問題はストリームのforeach内の例外を処理することです。 –

関連する問題