Originariamente inviato da raeco
Quale potrebbe essere il problema?
Un problema sta in b=b.concat(a.substring(i)): dopo l'inizializzazione la stringa a non viene più toccata, col risultato che continui a concatenare pezzi che non ti servono!
Ad esempio, se l'utente inserisce "ciao", iterazione dopo iterazione avrai questo comportamento:

i = 4
a = ciao
b =

i = 3
a = ciao
b =

i = 2
a = ciao
b = o

i = 1
a = ciao
b = oao

Inoltre alla prima iterazione (i = lunghezza della stringa) la chiamata a substring non ti restituisce nulla, dovresti partire da length - 1 e proseguire fino a i = 0, altrimenti salti un'iterazione!

Rimanenendo sul tuo esempio:

codice:
import javax.swing.JOptionPane;

public class s1 {
    public static void main(String[] args) {
        String a = JOptionPane.showInputDialog("Inserisci una stringa");
        String b = "";
        
        int i = a.length() - 1;
        while(i >= 0) {
            b += a.charAt(i--);
        }
        
        System.out.println("Stringa al rovescio: " + b);	
    }
}