Java try / catch / finally best practice durante l’acquisizione / chiusura delle risorse

Mentre lavoravo a un progetto scolastico, ho scritto il seguente codice:

FileOutputStream fos; ObjectOutputStream oos; try { fos = new FileOutputStream(file); oos = new ObjectOutputStream(fos); oos.writeObject(shapes); } catch (FileNotFoundException ex) { // complain to user } catch (IOException ex) { // notify user } finally { if (oos != null) oos.close(); if (fos != null) fos.close(); } 

Il problema è che Netbeans mi sta dicendo che le righe resource.close() generano una IOException e quindi devono essere catturate o dichiarate. Si lamenta inoltre che oos e fos potrebbero non essere ancora inizializzati (nonostante i controlli nulli).

Questo sembra un po ‘strano, visto che il punto è fermare la IOException proprio lì.

La mia correzione istintiva è di fare questo:

 } finally { try { if (oos != null) oos.close(); if (fos != null) fos.close(); } catch (IOException ex) { } } 

Ma in fondo mi disturba e mi sento sporco.

Vengo da uno sfondo C #, dove vorrei semplicemente sfruttare un blocco using , quindi non sono sicuro di quale sia il modo “giusto” per gestirlo.

Qual è il modo giusto per gestire questo problema?