An overriding method should throw only a subset/subclass of the checked exceptions declared by the original method.
By declaring the exceptions in the throws clause, you make sure that the calling program will handle those exceptions.
The above code will not compile. Let us assume that it compiles fine. Now if you assign a Child object to a Parent reference and invode the fetchInfo() method using the Parent reference, the compiler will force you to handle the IOException declared by the Parent class. But, at run time, the fetchInfo() method of the Child class will be called and in all probability the method may throw a ClassNotFoundException (and the caller never handled it). Hence, if the above code was allowed to go scott free by the compiler, the JVM would never attain salvation