codice:

/* classe che gestisce i numeri romani */
public class Romani {


private String NrRomano="";
private int NrArabo;
private boolean error=false;

/* costruisce un oggetto di tipo Romani String Nr.Romano
@param s di tipo Individuo, dati anagrafici dello studente corrispondente
all’oggetto Romani che si sta costruendo
@param n di tipo int, è il numero arabo da convertire
*/
public Romani(int n) {

if((n>0)&&(n<4000))
NrArabo = n;
else{
//condizione di errore
NrRomano = "";
error=true;
}
}//Romani
public Romani(String s) {
if(isRomano(s)) NrRomano=s;
else {
NrArabo=0;
error=true;
}

}



/** @return il riferimento ad un oggetto di tipo String che corrisponde
al numero romano il quale rappresentata dall’oggetto ricevente */
public String getNumeroRomano() {
return NrRomano;
}//getNumeroRomano



/** @return il riferimento ad un oggetto di tipo String che rappresenta
lo studente corrispondente all’oggetto ricevente */
public String toString() {
return NrArabo+" = "+NrRomano;
}//toString



/**@return il numero romano dell’oggetto ricevente*/
public String calcolaNumeroRomano(){
if(error) return "";
int[] VettArabo;
int count=0; //determina la lunghezza del vettore
int quoziente,i; //buffer

/*dividere il numero arabo per 10, conteggiando il numero di divisioni, fino a quando il quoziente non è pari
a zero, in modo tale da ricavare l'ordne del vettore e scindere il numero in cifre*/
quoziente=NrArabo;
do{
quoziente=quoziente/10;
count++;
}while(quoziente!=0);

//instanzio il vettore
VettArabo = new int[count];

//divido il numero in cifre mettendo alla cifra più significativa le migliaia e in quella meno significativa le unità
for(i=VettArabo.length-1;i>=0;i--){ //NON ENTRA NEL CICLO !!
VettArabo[i] = NrArabo%10;
//System.out.print("VettArabo["+i+"]"+VettArabo[i]);
NrArabo/=10;
}//for

//Conversione
for(i=0;i<VettArabo.length;i++){
if(count==4){ //migliaia
if(VettArabo[i]==1)
NrRomano=NrRomano+"M";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"MM";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"MMM";
}//if count=4
else if (count==3){ //centinaia
if(VettArabo[i]==1)
NrRomano=NrRomano+"C";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"CC";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"CCC";
else if(VettArabo[i]==4)
NrRomano=NrRomano+"CD";
else if(VettArabo[i]==5)
NrRomano=NrRomano+"D";
else if(VettArabo[i]==6)
NrRomano=NrRomano+"DC";
else if(VettArabo[i]==7)
NrRomano=NrRomano+"DCC";
else if(VettArabo[i]==8)
NrRomano=NrRomano+"DCCC";
else if(VettArabo[i]==9)
NrRomano=NrRomano+"CM";
}//if count=3
else if (count==2){ //decine
if(VettArabo[i]==1)
NrRomano=NrRomano+"X";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"XX";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"XXX";
else if(VettArabo[i]==4)
NrRomano=NrRomano+"XL";
else if(VettArabo[i]==5)
NrRomano=NrRomano+"L";
else if(VettArabo[i]==6)
NrRomano=NrRomano+"LX";
else if(VettArabo[i]==7)
NrRomano=NrRomano+"LXX";
else if(VettArabo[i]==8)
NrRomano=NrRomano+"LXXX";
else if(VettArabo[i]==9)
NrRomano=NrRomano+"XC";
}//if count=2
else if (count==1){ //unità
if(VettArabo[i]==1)
NrRomano=NrRomano+"I";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"II";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"III";
else if(VettArabo[i]==4)
NrRomano=NrRomano+"IV";
else if(VettArabo[i]==5)
NrRomano=NrRomano+"V";
else if(VettArabo[i]==6)
NrRomano=NrRomano+"VI";
else if(VettArabo[i]==7)
NrRomano=NrRomano+"VII";
else if(VettArabo[i]==8)
NrRomano=NrRomano+"VIII";
else if(VettArabo[i]==9)
NrRomano=NrRomano+"IX";
}//if count=1
count--;
}//for

return NrRomano;
}//calcolaNumeroRomano

/*@param n di tipo String, rappresenta il la sequenza da controllare se è un numero romano scritto correttamente
@return true se scritto correttamente, false altrimenti*/
public boolean isRomano(String n){
int i=0;
boolean romano = true;
if(n.length()>0){
//verifica se in n ci sono solo simboli appartenenti all'alfabeto dei numeri romani
while((i<n.length())&&(romano)){
if(!(n.substring(i,i+1).equals("I") || n.substring(i,i+1).equals("V") || n.substring(i,i+1).equals("X") || n.substring(i,i+1).equals("L") || n.substring(i,i+1).equals("C") || n.substring(i,i+1).equals("D") || n.substring(i,i+1).equals("M")))
romano = false;
i++;
}//while
}//if

return romano;
}//isRomano

/*@return il numero arabo dell’oggetto ricevente*/
public int calcolaNumeroArabo(){
if(error) return -1;
int i=0;

//Conversione
while(i<NrRomano.length()){ //ERRORE: non legge l'ultimo carattere


if(NrRomano.substring(i,i+1).equals("M")) //migliaia
NrArabo+=1000;
else if (NrRomano.substring(i,i+1).equals("C")) //centinaia

if(i<NrRomano.length()-1 && NrRomano.substring(i,i+2).equals("CD")){ //400
NrArabo+=400;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else if(i<NrRomano.length()-1 && NrRomano.substring(i,i+2).equals("CM")){ //900
NrArabo+=900;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else
NrArabo+=100;

else if (NrRomano.substring(i,i+1).equals("D"))
NrArabo+=500;
else if (NrRomano.substring(i,i+1).equals("X")) //decine

if(i<NrRomano.length()-1 && NrRomano.substring(i,i+2).equals("XL")){ //40
NrArabo+=40;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else if(i<NrRomano.length()-1 && NrRomano.substring(i,i+2).equals("XC")){ //90
NrArabo+=90;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else
NrArabo+=10;

if (NrRomano.substring(i,i+1).equals("L"))
NrArabo+=50;
if (NrRomano.substring(i,i+1).equals("I")){ //unità

if(i<NrRomano.length()-1 && NrRomano.substring(i,i+2).equals("IV")){ //4
NrArabo+=4;
 i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else if(i<NrRomano.length()-1 && NrRomano.substring(i,i+2).equals("IX")){ //9
NrArabo+=9;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else
NrArabo+=1;
}
else if (NrRomano.substring(i,i+1).equals("V"))
  
   if(i<NrRomano.length()-1 && NrRomano.substring(i,i+2).equals("VI"))
    NrArabo+=6;
else
NrArabo+=5;

i++; //incrementa posizione successiva

}//while

return NrArabo;
}//calcolaNumeroArabo

}//Romani
Guarda da qualche errore su qualche numero ,come 45 e alcuni altri.
Però per tutti gli altri funza.Domani sera o dopo domani lo controllo meglio. Ora non sono nello stato d'animo per farlo.

Le aggiunte sono in rosso.
Ho eliminato pure il codice esterno al while non è più utile.
E' bastato aggiungere un controllo prima delle substring(i,i+2)