ホームページ >Java >&#&チュートリアル >Java 8 Lambda および Streams からスローされたチェック済み例外を処理するにはどうすればよいですか?

Java 8 Lambda および Streams からスローされたチェック済み例外を処理するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-10 20:36:10260ブラウズ

How Can I Handle Checked Exceptions Thrown from Java 8 Lambdas and Streams?

Java 8 Lambda および Streams からのチェック済み例外のスロー

ランタイム例外とは異なり、チェック済み例外は Java コードで明示的に処理する必要があります。ただし、ラムダ式とストリームを使用する場合、開発者はチェック例外をスローするという課題に遭遇する可能性があります。この記事では、これらのコンテキストでチェック例外を処理するための制限と潜在的な解決策について説明します。

制限事項:

現在の Java 8 構文には、チェック例外をスローする直接メカニズムが提供されていません。ストリームで使用されるラムダ式内からの例外。次のコード スニペットは、発生したコンパイル エラーを示しています。

import java.util.List;
import java.util.stream.Stream;

public class CheckedStream {
    public List<Class> getClasses() throws ClassNotFoundException {
        Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
              .map(className -> Class.forName(className))
              .collect(Collectors.toList());
    }
}

この問題は、Function や Stream などのストリームで使用される関数インターフェイスが、チェック例外のスローをサポートする型パラメーターを宣言していないという事実に起因します。その結果、コンパイラは正確な例外タイプを推論できず、コンパイル エラーを報告します。

Oracle のジレンマ:

この機能の省略は、実行中の見落としに起因すると考えられます。 Java 8 の機能インターフェイスの設計。 Java コミュニティはこの制限について Oracle を広く批判しており、その多くはこれが API の重大なバグであり、チェック例外一般の欠点であると主張しています。

代替案と回避策:

Java 8 はラムダからのチェック例外のスローを直接サポートしていませんが、回避策はあります利用可能:

1.チェック例外を実行時例外でラップする:

このアプローチには、チェック例外を実行時例外でラップし、ラップされた例外をラムダ式内でスローすることが含まれます。

// Import the necessary class.
import java.io.IOException;

// Create a wrapper class to wrap checked exceptions.
public class CheckedExceptionWrapper {

    public static void main(String[] args) {
        // Create a stream of strings.
        Stream<String> stream = Stream.of("file1.txt", "file2.txt", "file3.txt");

        // Map the stream using a lambda that wraps checked exceptions.
        stream = stream.map(file -> {
            try {
                // Read the file.
                FileReader reader = new FileReader(file);
                reader.close();
                return file;
            } catch (IOException e) {
                // Wrap the checked exception in a runtime exception.
                throw new RuntimeException(e);
            }
        });

        // Collect the results.
        List<String> files = stream.collect(Collectors.toList());
    }
}

2. Checked Supplier の使用:

guava ライブラリの CheckedSupplier インターフェイスを使用すると、チェック例外をスローするサプライヤーを作成できます。このインターフェイスを使用すると、チェック例外スロー コードをラムダ式でラップできます。

// Import the necessary class.
import com.google.common.base.CheckedSupplier;

// Create a checked supplier that throws a checked exception.
CheckedSupplier<String> supplier = () -> {
    // Code that throws a checked exception.
    throw new RuntimeException();
};

// Get the result from the supplier.
try {
    String result = supplier.get();
} catch (Exception e) {
    // Handle the exception.
}

3.チェック例外の使用を避けるためのコードの書き換え:

チェック例外を使用する代わりに、別の方法でエラーを処理するようにコードを書き直すことを検討してください。たとえば、Optional クラスを使用してオプションの値を表したり、未チェックの例外をスローし、try-catch ブロックを使用してそれらの例外を処理したりできます。

4. Catch and Throw ブロックの使用:

このアプローチは簡単ですが、コードが冗長になり読みにくくなる可能性があります。

// Example for Java 7 with try/catch
try {
    // Code that throws a checked exception.
    throw new RuntimeException();
} catch (Exception e) {
    // Handle the exception.
}

結論:

Java 8 の構文はラムダやストリームからのチェック例外のスローを直接サポートしていませんが、回避策が利用可能です。特定の状況にどのアプローチが適切であるかを慎重に検討してください。

以上がJava 8 Lambda および Streams からスローされたチェック済み例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。