In Chapter 8, pag. 443, the constructors for FileReader and FileWriter are introduced. All the constructors are said to throw a FileNotFoundException, but the official Java 11 documentation says that the constructors for FileWriter throw an IOException.
Please go through the source for those constructors. You may find they contain lines like ...throw new FileNotFoundException(...);. Since FileNotFoundException is a strict subtype of IOException, you may find that both the following statements are true.
1: Those constructors declare an IOException
2: If anything goes wrong creating an instance, a FileNotFoundException will be thrown.
The declaration (No 1) determines the handling of code by the compiler and the throw statement determines the runtime type of any exception actually thrown. I am not sure about this, but the source may elucidate the problem further.