Il metodo nextInt() fa due cose:

1) Se nel buffer di input esiste già un valore numerico, lo restituisce e lo toglie dal buffer
2) Se nel buffer di input non è presente un valore numerico, si mette in attesa dell'inserimento.

Quindi, ogni volta che chiami nextInt() stai chiedendo all'utente di inserire un nuovo valore.

Generalmente l'I/O va fatto seguendo un filo logico.

1) Chiedo un valore all'utente e memorizzo tale valore in una variabile
2) Solo DOPO la memorizzazione nella variabile, vado a fare tutte le considerazioni del caso (usando la variabile!)
3) Se le valutazioni hanno dato esito negativo, ripeto la richiesta di inserimento e memorizzazione dati.

Uno schema abbozzato potrebbe essere il seguente:

codice:
int valore = -1;   // Un valore che so già non mi va bene, ma lo uso per inizializzazione
while(valore < 0) {
   // Chiedo il valore all'utente
   System.out.println("Inserisci il valore:");

   // Leggo il valore da input
   valore = scrivi.nextInt();

   // Eventuali altre considerazioni sul valore (esempio, deve essere compreso fra un minimo ed un massimo, ecc)
   ...   
}

// Se sono arrivato qui, significa che l'utente ha inserito un valore maggiore di 0
...   // procedo con il resto del programma, usando "valore" e non più "nextInt()" (che farebbe un'altra lettura da input)

Ciao.