OCP 17 Exam - chapter 11 notes
try-with-resources
can be used only with classes that implement
AutoCloseable
(alsojava.io.Closeable
which extendsAutoCloseable
)two or more resources can be defined in one
try
, separated by;
implicit
finally
blocked, that closes resource, is executed before any programmer code (catch
or explicitfinally
)suppressed exception is exception that was thrown when closing resource in
try-with-resources
while handing another exception fromtry
block. Java treats first exception as primary and other asjava.lang.Throwable.getSuppressed
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
static record ThrowsOnClosing(String name) implements AutoCloseable {
public void close() throws Exception { // throws is optional!!
System.out.println(" - closing java.lang.AutoCloseable: " + name);
throw new IllegalArgumentException("closing resource: " + name);
}
}
static record ThrowsOnClosingClosable(String name) implements java.io.Closeable { // Closeable extends AutoCloseable
public void close() throws java.io.IOException { // throws is optional!!
System.out.println(" - closing java.io.Closeable: " + name);
throw new IllegalArgumentException("closing resource: " + name);
}
}
static void tryWithResources()
throws Exception // since AutoCloseable#close can throw Exception we must catch it or declared as throws; otherwise DOES NOT COMPILE
{
var res2 = new ThrowsOnClosing("res2"); // effectively final
try(var res1 = new ThrowsOnClosing("res1");
res2; // automatically close res2
var res3 = new ThrowsOnClosingClosable("res3");
ThrowsOnClosing res4 = null) { // null is allowed
System.out.println(" - try block");
throw new IllegalArgumentException("thrown inside try");
} catch (IllegalArgumentException e) {
System.out.println(" - catch block");
throw new IllegalArgumentException("rethrowing " + e.getMessage(), e);
} finally {
System.out.println(" - finally block");
// throw new IllegalArgumentException("throwing from here will hide any previous exception!!");
}
}
// ---
public static void main(String[] args) {
try {
tryWithResources();
} catch (Exception e){
System.out.println("Caught: " + e.getMessage());
for (Throwable t: e.getCause().getSuppressed()) {
System.out.println("Suppressed: "+t.getMessage());
}
}
}
prints:
1
2
3
4
5
6
7
8
9
10
- try block
- closing java.io.Closeable: res3
- closing java.lang.AutoCloseable: res2
- closing java.lang.AutoCloseable: res1
- catch block
- finally block
Caught: rethrowing thrown inside try
Suppressed: closing resource: res3
Suppressed: closing resource: res2
Suppressed: closing resource: res1
the order of exceptions in
catch
block is important - first more specific exceptions (e.g. IllegalArgumentException) then more general (e.g. RuntimeException). Otherwise there will be compile error that catch block is unreachable (review Q.4)
try-with-resources cannot be declared w/o braces like
if
!! (review Q.13)
Formatting
- decimal format
#
digit is optional,0
if digit is absent then puts `0’1 2 3 4
System.out.println(new DecimalFormat("#,##.000").format(1234.5)); // prints 12,34.500 System.out.println(new DecimalFormat(".###").format(1234.5)); // prints 1234.5 // System.out.println(new DecimalFormat("#.#.#").format(1234.5)); // java.lang.IllegalArgumentException: Multiple decimal separators in pattern "#.#.#" System.out.println(new DecimalFormat("000.###").format(1)); // prints 001
- date formatting example (review Q.16): ```java System.out.println(ZonedDateTime.now().format(DateTimeFormatter.ofPattern(“yyyy-MM-dd ‘at’ HH:mm:ss z (Z)”, Locale.ENGLISH))); // prints e.g. 2014-02-02 at 21:30:57 CEST (+0200)
1
2
3
4
5
- be aware that text inside pattern must be inside `'`:
```java
// System.out.println(DateTimeFormatter.ofPattern("hh o'clock")); // java.lang.IllegalArgumentException: Unknown pattern letter: o
System.out.println(DateTimeFormatter.ofPattern("hh 'o''clock'").format(LocalTime.now())); // 12 o'clock (use ' to escape ')
be aware that you should not use date formatting for
LocalTime
, otherwise there will be RuntimeException!
- number formatting examples:
1 2 3 4 5 6 7
double amount = 120_400.02; System.out.println(NumberFormat.getCompactNumberInstance().format(amount)); // 120K System.out.println(NumberFormat.getCompactNumberInstance(new Locale("en"), Style.SHORT).format(amount)); // 120K System.out.println(NumberFormat.getCompactNumberInstance(new Locale("en"), Style.LONG).format(amount)); // 120 thousand System.out.println(NumberFormat.getCurrencyInstance().format(amount)); // $120,400.02 System.out.println(NumberFormat.getCurrencyInstance(new Locale("pl")).format(amount)); // 120 400,02 ¤ System.out.println(NumberFormat.getCurrencyInstance(new Locale("pl", "PL")).format(amount)); // 120 400,02 zł
Locale
- in Java 17.0.7 all following compiles and run w/o Exception (review Q.15):
1 2 3 4
System.out.println(new Locale("ab")); // prints ab System.out.println(new Locale("cd", "GGGG")); // prints cd_GGGG System.out.println(new Locale("CD")); // prints cd System.out.println(new Locale("CD", "country")); // prints cd_COUNTRY
exam might trick us with using a variable name that is already used!
Playground code
https://github.com/RG9/rg-playground-ocp17/blob/main/Chapter11.java
Credit: OCP Oracle Certified Professional Java SE 17 Developer Study Guide