public class DemoPilaChecked {
    static final class PilaPienaException extends Exception {
        private static final long serialVersionUID = 1L;
        private final int capacita;
        private final int valoreRifiutato;

        PilaPienaException(int capacita, int valoreRifiutato) {
            super("pila piena");
            this.capacita = capacita;
            this.valoreRifiutato = valoreRifiutato;
        }

        int capacita() {
            return capacita;
        }

        int valoreRifiutato() {
            return valoreRifiutato;
        }
    }

    static final class PilaControllata {
        private final int[] elementi;
        private int dimensione;

        PilaControllata(int capacita) {
            if (capacita <= 0) {
                throw new IllegalArgumentException("capacita non positiva");
            }
            elementi = new int[capacita];
        }

        void inserisci(int valore) throws PilaPienaException {
            if (dimensione == elementi.length) {
                throw new PilaPienaException(elementi.length, valore);
            }
            elementi[dimensione++] = valore;
        }

        int dimensione() {
            return dimensione;
        }
    }

    public static void main(String[] args) {
        PilaControllata pila = new PilaControllata(2);
        try {
            pila.inserisci(7);
            pila.inserisci(12);
            pila.inserisci(99);
        } catch (PilaPienaException errore) {
            System.out.println(errore.getMessage() + ": " + errore.capacita());
            System.out.println("rifiutato: " + errore.valoreRifiutato());
        }
        System.out.println("dimensione: " + pila.dimensione());
    }
}
