Ho un errore di Stack OverFlow nel seguente programma:

codice:
public class Coprimi {
    private int[] insieme;
    private int cont = 0;

    public Coprimi () {
        insieme = new int [100];
    }

    public boolean aggiungi(int n) {
        if(cont>100) {
            System.out.println("troppi elementi nell'insieme");
            return false;
        }
        if (mcd(n)!=1) return false;
        else {
            insieme[cont] = n;
            cont++;
            return true;
        }
    }

    public int mcd (int n) {
        int max=1;
        for (int i=0;i<cont;i++) {
            if (mcd2(insieme[i],n)>max) {
                max = mcd2(insieme[i],n);
            }
        }
        return max;
    }

    public static int mcd2 (int x,int y) {
        if(x==0) return y;
        else if (x < y) return (mcd2(y-x , y));
        else return (mcd2(x , x-y));
    }
}

public class TestCoprimi {
    public static void main (String[] args) {
        Coprimi numero1 = new Coprimi();
        System.out.println(numero1.aggiungi(15));
        System.out.println(numero1.aggiungi(14));
        System.out.println(numero1.aggiungi(11));
        System.out.println(numero1.mcd2(35,11));
    }
}
Il testo dell'esercizio recita così:

Definire una classe Coprimi per gestire insiemi di numeri interi tra loro coprimi. Il costruttore inizializza l'insieme come vuoto. La classe ha due metodi aggiungi e mcd. Il metodo aggiungi prende come argomento un intero e se questo è coprimo con tutti i numeri nell'insieme lo aggiunge all'insieme e ritorna true, altrmenti non fa nulla e ritorna false. Il metodo mcd prende come argomento un intero e ritorna il massimo comun divisore tra l'intero e gli interi dell'insieme. Ad esempio se l'insieme è {15, 14, 11} e l'argomento è 35 allora il metodo ritorna 7.