2015-11-18 5 views
36

は:「ダックの例外」とはどういう意味ですか? Java™チュートリアルの<a href="https://docs.oracle.com/javase/tutorial/essential/exceptions/advantages.html">Advantages of Exceptions</a>セクションで

方法は、アヒル、それによって方法をできるように、その中にスローされた例外は遠くコールスタックまでそれをキャッチすることができます。

[...]

...例外をダッキングして仲介方法の一部にいくつかの努力が必要です。メソッド内でスローすることができるチェックされた例外は、そのthrows節で指定する必要があります。

「ダックの例外」とは何ですか?私はWebとFOLDOC(Free Online Dictionary of Computing)を検索しましたが、有望なものは見つけられませんでした。

+1

チュートリアルに示されている疑似コードから、私はメソッド自体で例外をキャッチしないことを意味しますが、チェックされた例外は 'throws'節に追加されます)、コールスタックのメソッドよりも先にキャッチすることができます –

+1

" duck "は、このコンテキストでは、例外を呼び出し側に転送することを意味します。 – Flown

+23

まあ...ダックはヒットするのを避けるために頭を下げることを意味します。あなたのメソッドが例外によってヒットしないようにするには、あなたのメソッドに 'throws'例外を宣言することによって呼び出しスタックをさらにスローします。 – jmcg

答えて

27

"ダックの例外 "とは、"例外を処理しない "ことを意味します。これは実際に名前を説明します:to duckは「回避する」を意味します。

例外を回避するメソッドは、(たとえば目的ではないなどの理由から)例外を処理せず、例外を呼び出しメソッドにスローさせます。

たとえば、ファイル内の行数をカウントする方法を考えてみましょう。それが法の目的ではないので、この方法は、Files.newBufferedReader(path)によってスローされIOExceptionを処理しないことを

private static long numberOfLines(Path path) throws IOException { 
    try (BufferedReader br = Files.newBufferedReader(path)) { 
     return br.lines().count(); 
    } 
} 

注:これは単純な実装(Javaの8)になります。アヒルはそれを適切に処理します。

など注意呼び出し側は例外鴨とその呼び出し側がそれを処理させるかもしれない、

5

私は、メソッドが例外をキャッチし、他のメソッドがそれをキャッチして必要に応じて処理できるようにすることを意味すると思います。または、新しい例外をスローするだけです。または、例外をキャッチすることを避け、コールスタックをバブルアップさせます。要点は、ある特定の例外(例えば、必要なデータおよび/または状態にアクセスすること)を処理することにより適切であるかもしれない他の方法にメソッドを代行例外処理にすることです。しかし、(javaのために)これは、@のjmcgさんのコメントで述べたように、容易

定型となり、すべての時間は、文字通り「DUCKは、単にヒットまたはを見られないようにするために、あなたの頭を下げることを意味throws句で宣言する方法が必要です"(アヒルのように川で)

+0

ダッキングとは、捕まえて再就くことを意味しません。 「キャッチを避ける」という部分は正しく聞こえますが、前の2つの文は間違っています。 – vikingsteve

+0

@vikingsteve、おそらくそうですが、依然として委任についてですが、メソッドは実際にはいくつかのことを行うために例外をキャッチし、残りのために委譲するためにそれを再スローすることができます。完全性のために追加されました –

+2

あなたはいくつかのケースについて説明しましたが、あなたが本当に質問に答えているとは思わない - それはかなり具体的です。例外を「処理」すると言われた場合は、あなたが記述するケースがより有効であると思います。 – vikingsteve

29

まあ、単純にダッキングしてヒットするか見られないようにするために、あなたの頭を下げることを意味します。この場合、 'duck an exception'とは、コードが例外に遭わないようにすることを意味します。例外がヒットすることなく、あなたの方法については

、あなたはアヒルをしない場合、あなたの方法

public void myMethod() throws IOException { 

} 

throws例外を宣言することで、コールスタックまで、さらにそれを投げる、あなたはcatchそれに持っています:

public void myMethod() { 
    try { 
     // ... 

    } catch(IOException e) { 
     // handle exception 
    } 
+26

残念ながら、Javaは顔のメソッドをヒットする例外を提供する方法を提供していないので、これらは唯一の2つのオプションです。 –

+1

@Elogent 'try {someCheckedExceptionHere(); } catch(SomeCheckedException e){新しいRuntimeException(e)をスローする; } 'チェック例外を処理する必要があるときにこれを頻繁に行い、アプリケーションがクラッシュする(たとえば、アプリケーションを起動するために必要なJavaFXシーンを記述するFXMLファイルを読み込めないなど)。 – RAnders00

0

ダックは例外を再スローすると思います...言い換えれば、他の誰かがそれを処理することを期待してそれを無視してください:)

関連する問題