帰りに最後にブロックにJava
-
09-06-2019 - |
質問
驚いたため、最近では見ることが可能で返り算書にfinallyブロックにJava.
そのような多くの人が思いも悪いものとして説'んで返しfinally'.引掻少し深くん'Javaの返還しないも'るかの恐ろしい事例その他の種類の流量制御に最後にブロックとなります。
なので、私の質問は、誰にも言えが返算書(またはその他の流量制御に最後にブロックの生産まで、良い読みやすくするためにコードについて教えてください。
解決
事例にお客様よりご提供いただいたのは理由が ない 利用の流れ-からの制御があります。
場合もあり、逆に例がらも"良い"と考え、開発者を維持するコードは後者のような認識機微.この貧しい開発者がもご用意しております。
他のヒント
私はメンタワイ島ここメンタワイ島はハダバ年前により引き起こされた。をコードしたようなもの:
Object problemMethod() {
Object rtn = null;
try {
rtn = somethingThatThrewAnException();
}
finally {
doSomeCleanup();
return rtn;
}
}
この例外がスローされるまでにその他のコードです。また巻き込まれ、ログインし、rethrown内 somethingThatThrewAnException()
方法。でも、例外なって伝播するまでの過去 problemMethod()
.その後長い時間見ることを最後に追跡でに返す方法です。の方法により利用申込を行い、最後にブロックは基本的に止める例外が起きたのかをtryブロックから伝播するものがなされます。
のようにそれがありますが、法務返還から最後にブロックには、Javaの仕様では、悪いものとなります。
javacに警告を表示の返却します最後にご利用の場合-Xlint:があります。もともとjavac放出されない警告の場合に誤りがあるのではない。残念ながらの下位互換性が想定外独創的な愚かさは禁止します。
例外をスローすることができから最後にブロック、その場合は、出展挙動はほぼ確実と考えている。
追加の制御構造を返します最後に{}ブロックのもの"だけでできるので、"人権侵害するなどが点在しており、ほぼすべての開発。ジェイソンもまた示唆するも簡単にメンテナンスの悪夢-の引数に対し早期返しますから機能を適用すでにこの場合は"遅を返します".
最後にブロックが存在する目的で、完全に整理し、自分で何が起こったすべてのその前のコードです。主としてこれが閉じ/リファイルポインタ、データベース接続等 がんがどのくらい引っ張られているかも加え別注オーディティング
その影響の機能であることが、try{}ブロックです。なかった方法で確認し、外部の状態にした操作に時間がかか、そのことをチェック状態にもっている場合が無効となり、だいたいのチェックのみ{}い土内で最後に{}の操作が失敗した場合、そしてチェックする状態の時に不必要.
簡単にGroovyの試験
public class Instance {
List<String> runningThreads = new ArrayList<String>()
void test(boolean returnInFinally) {
println "\ntest(returnInFinally: $returnInFinally)"
println "--------------------------------------------------------------------------"
println "before execute"
String result = execute(returnInFinally, false)
println "after execute -> result: " + result
println "--------------------------------------------------------------------------"
println "before execute"
try {
result = execute(returnInFinally, true)
println "after execute -> result: " + result
} catch (Exception ex) {
println "execute threw exception: " + ex.getMessage()
}
println "--------------------------------------------------------------------------\n"
}
String execute(boolean returnInFinally, boolean throwError) {
String thread = Thread.currentThread().getName()
println "...execute(returnInFinally: $returnInFinally, throwError: $throwError) - thread: $thread"
runningThreads.add(thread)
try {
if (throwError) {
println "...error in execute, throw exception"
throw new Exception("as you liked :-)")
}
println "...return 'OK' from execute"
return "OK"
} finally {
println "...pass finally block"
if (returnInFinally) return "return value from FINALLY ^^"
// runningThreads.remove(thread)
}
}
}
Instance instance = new Instance()
instance.test(false)
instance.test(true)
出力:
test(returnInFinally: false)
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: false, throwError: false) - thread: Thread-116
...return 'OK' from execute
...pass finally block
after execute -> result: OK
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: false, throwError: true) - thread: Thread-116
...error in execute, throw exception
...pass finally block
execute threw exception: as you liked :-)
-----------------------------------------------------------------------------
test(returnInFinally: true)
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: true, throwError: false) - thread: Thread-116
...return 'OK' from execute
...pass finally block
after execute -> result: return value from FINALLY ^^
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: true, throwError: true) - thread: Thread-116
...error in execute, throw exception
...pass finally block
after execute -> result: return value from FINALLY ^^
-----------------------------------------------------------------------------
質問
一つの興味深い点だったことを今でも覚えているかGroovyお得な暗黙に戻ります。にGroovyで"戻る"から方法だけを残して価値のなした。何を思い起こすstrncasecmpの runningThreads.remove(..) ラインの最後に決まるこの上書きの戻り値("OK")フィードバックを、例外?!