In the following code snippet, there are cases where the processes cannot handle NullPointerException and IllegalStateException. Namely in the case where I have the input values val=-4 or val=-2. 
I read that adding throws after methods' signatures would help. But the code still aborts if I pass the mentioned values over. 
public class Test extends Throwable{
    public static void processA(int val ) throws NullPointerException, IllegalStateException{
        try{
            System.out.println("1");
            processB(val);
        }catch(ArithmeticException e){
            System.out.println("2");
        }
        System.out.println("3");
    }
    public static void processB(int val) throws NullPointerException, IllegalStateException{
        try{
            System.out.println("4");
            processC(val);
        }catch(NullPointerException e){
            System.out.println("5");
            processC(val+4);
        }finally{
            System.out.println("6");
        }
        System.out.println("7");
    }
    public  static void processC(int val)throws NullPointerException, IllegalStateException, ArithmeticException{
        System.out.println("8");
        if(val<1) throw new NullPointerException();
        if(val==1) throw new ArithmeticException();
        if(val>1) throw new IllegalStateException();
        System.out.println("9");
    }
    public static void main(String[] args) throws Exception {
         processA(1); //processA(-2) or processA(-4)
    }
}
 
     
    