As per the overriding rule,
The overridden method can throw fewer exceptions thrown by super class method and/or covariant subclass of the exception thrown by super class method and/or RuntimeExceptions.
Class A2 had overridden the method to throw only Exception2 and removes Exception1. Caller of A2.test() will expect only Exception2 and NOT Exception1.
When Class A3 overrides the method, it can throw only Exception2 and Exception3 which is Runtime exception OR no exceptions at all.
If A3.test() throws Exception1 then it will voilate the contract of A2.test() as it does not throw Exception1.
following should hold true when overriding
If A3.test() throws Exception1, then code change will be required, that is what
Java avoids. The new implementation should be backward compatible.