In the HFSJ book, the doGet() method is sometimes listed as throwing only IOException, and in other cases, it is shown to be throwing both ServletException, IOException. Is this an error in the book, or is there a reason why in some cases the doGet() method would only throw IOException vs throwing both ServletException, IOException?
The throws clause of doGet() of HttpServlet class has ServletException as well as IOException. So the subclass servlet's doGet method can have a throws clause containing either of these exceptions (or both or none, refer SCJP ).
Now, based on what the servlet is doing in its doGet method, it can define its throws clause. For example, if the method body does not call any method that throws IOException, the method declaration of doGet may choose not to list IOException in its throws clause. Same for ServletException.