常にキャッチが続かなければならないのでしょうか?

static void test() {
    try {
        System.out.print(x.toString() + " ");
    }
    finally { System.out.print("finally "); }
}

public static void main(String args[])
{
    try 
    {
        test(); 
    }
    catch (Exception ex) { System.out.print("exception "); 
}

出力は finally exception です。

test() try catch が続かないのに、コンパイル時にエラーがスローされないのはなぜですか?

0
@クリス、真実ではない。チェックされた例外は実行時例外ではなく、 try-catch-finally は例外に対して有効です。
追加された 著者 Buhake Sindi,
try-catch-finallyは実行時の例外であり、コンパイル時のエラーではありません
追加された 著者 Kris,
@TEG申し訳ありませんが、私はちょうどtry-catchの有用性を指摘したかったのですが、最終的には時間エラーをコンパイルすることになりました。プログラムの実行時ではなく、コンパイル時
追加された 著者 Kris,

7 答え

Java 7の追加ARM(Automatic Resource Management)は、 try を単独で使用できることを意味します。

try (PrintWriter pw = new PrintWriter("out.txt")) {
    pw.println("Hello World!");
}

このスコープが終了すると、 pw が終了します。

9
追加された

バージョン7より前のJavaバージョンでは、try-catch-finallyの次の3つの組み合わせが可能です。

try - catch
try - catch - finally
try - finally

静的フィールドとして宣言されていない x がないので、インラインまたは main メソッドでは例外はおそらく NullPointerException です。 finally ブロックは、 try ブロックまたは/および catch ブロックで何が行われていても常に実行されます。

5
追加された
どういうわけかintelliJで@PeterLawrey私はJava 8で一人で試してみることはできません:
追加された 著者 El Mac,
@PeterLawreyまず、私はあなたの答えを読むまでJavaがARMアーキテクチャ(RISCベース)で使用されていることを知っていたことにショックを受けました;)
追加された 著者 Johnydep,
おかげさまでこれは非常に有益でした!
追加された 著者 Johnydep,
Java 7では、ARM用に try を単独で使用できます。 ;)
追加された 著者 Peter Lawrey,
@Johnydep JavaはARMのLinuxでも利用できます;)
追加された 著者 Peter Lawrey,
@Johnydep Javaの実行をサポートするオプションのARM機能があります。
追加された 著者 Tom Hawtin - tackline,

唯一の必要条件は、finallyブロックの後に少なくとも1つのキャッチブロック または が続く必要があることです。

参照:Java言語の tryステートメント仕様。

3
追加された

tryは必ずしもcatch節を必要としません。

javaの有効な例外処理句は次のとおりです。

  • try-catch clause,
  • try-finally clause or
  • try-catch-finally clause.

JLSの第11.3章「例外の処理」を確認してください。

tryの後にcatchまたはJavaのfinallyブロックが続かなければなりません。

最終的にそこにいる場合はキャッチは必要ありません。

1
追加された

本当にあなた自身の質問に答えました。 tryブロックにキャッチが続く必要がないため、コンパイル時エラーはありません。それは意味的に正しいものであり、しばしば試してみると最終的にブロックが必要になることがあります。

例外がメソッドからスローされている可能性がありますが、依然として接続を終了したいと考えています。

例えば:

public void connect() throws IOException {
    Socket s = new Socket();
    try {
        s.getInputStream();         
    }
    finally {
        s.close();
    }
}
0
追加された

try must either by followed by catch or finally. no need of catch block always. Without either of catch or finally compile time error will occur

0
追加された