Yes. A single try can have several catch blocks, and Java runs the first one whose type matches the thrown exception. At most one of them runs.
try {
// risky code
} catch (FileNotFoundException e) {
// handle file not found
} catch (IOException e) {
// handle other IO exceptions
} catch (Exception e) {
// handle any other exception
}
Because the first match wins, order them from most specific to most general. The compiler enforces this. A catch for a subclass placed after a catch for its superclass could never run, so it is a compile-time error. In the example, FileNotFoundException must come before IOException, and Exception goes last.
One block can also catch several unrelated types joined with |, as in catch (IOException | SQLException e). Use this multi-catch form when the handling is the same for each type. Its parameter is implicitly final.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓