Estou fazendo uma calculadora e a String "expressaoToda" está ficando vazia no terceiro "for" no evento do botão "+",

package calculadora;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Principal {

static Double convert = null;
static Double convertDois = null;
static double resultado;
static String expressaoToda;
static int posicaoDoSinalMais = 0;
static double num1 = 0;
static double num2 = 0;
static StringBuilder num1ComoString = new StringBuilder();
static StringBuilder num2ComoString = new StringBuilder();

public static void main(String[] args) {

	JFrame janela = new JFrame("Calculadora");
	StringBuilder textoCalcular = new StringBuilder();

	janela.setSize(400, 590);
	janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	janela.getContentPane().setBackground(Color.BLACK);

	JTextField calculando = new JTextField();
	calculando.setBounds(20, 60, 350, 100);
	janela.add(calculando);

	JButton ponto = new JButton(".");
	ponto.setBounds(janela.getWidth() - 89, 400, 60, 60);
	janela.add(ponto);

	ponto.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append(".");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoUm = new JButton("1");
	botaoUm.setBounds(janela.getWidth() - 89, 330, 60, 60);
	janela.add(botaoUm);

	botaoUm.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("1");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoDois = new JButton("2");
	botaoDois.setBounds(janela.getWidth() - 89, 260, 60, 60);
	janela.add(botaoDois);

	botaoDois.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("2");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoTres = new JButton("3");
	botaoTres.setBounds(janela.getWidth() - 89, 190, 60, 60);
	janela.add(botaoTres);

	botaoTres.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("3");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoZero = new JButton("0");
	botaoZero.setBounds(janela.getWidth() - 160, 400, 60, 60);
	janela.add(botaoZero);

	botaoZero.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("0");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoQuatro = new JButton("4");
	botaoQuatro.setBounds(janela.getWidth() - 160, 330, 60, 60);
	janela.add(botaoQuatro);

	botaoQuatro.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("4");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoCinco = new JButton("5");
	botaoCinco.setBounds(janela.getWidth() - 160, 260, 60, 60);
	janela.add(botaoCinco);

	botaoCinco.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("5");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoSeis = new JButton("6");
	botaoSeis.setBounds(janela.getWidth() - 160, 190, 60, 60);
	janela.add(botaoSeis);

	botaoSeis.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("6");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoDiferente = new JButton("≠");
	botaoDiferente.setBounds(janela.getWidth() - 230, 400, 60, 60);
	janela.add(botaoDiferente);

	botaoDiferente.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("≠");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoSete = new JButton("7");
	botaoSete.setBounds(janela.getWidth() - 230, 330, 60, 60);
	janela.add(botaoSete);

	botaoSete.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("7");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoOito = new JButton("8");
	botaoOito.setBounds(janela.getWidth() - 230, 260, 60, 60);
	janela.add(botaoOito);

	botaoOito.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("8");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoNove = new JButton("9");
	botaoNove.setBounds(janela.getWidth() - 230, 190, 60, 60);
	janela.add(botaoNove);

	botaoNove.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("9");
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoBack = new JButton("⌦");
	botaoBack.setBounds(janela.getWidth() - 300, 190, 60, 60);
	janela.add(botaoBack);

	botaoBack.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			if (textoCalcular.length() > 0) {
				textoCalcular.deleteCharAt(textoCalcular.length() - 1);
				calculando.setText(textoCalcular.toString());
			}
		}
	});

	JButton botaoAC = new JButton("AC");
	botaoAC.setBounds(janela.getWidth() - 300, 260, 60, 60);
	janela.add(botaoAC);

	botaoAC.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.delete(0, textoCalcular.length());
			calculando.setText(textoCalcular.toString());
		}
	});

	JButton botaoMais = new JButton("+");
	botaoMais.setBounds(janela.getWidth() - 300, 330, 60, 60);
	janela.add(botaoMais);

	botaoMais.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append("+");
			
			calculando.setText(textoCalcular.toString());

			expressaoToda = textoCalcular.toString();

			for (int i = 0; i < expressaoToda.length(); i++) {
				if (expressaoToda.charAt(i) == '+') {
					posicaoDoSinalMais = i;
					break;
				}
			}
			System.out.println("Posição do sinal encontrado: " + posicaoDoSinalMais);

			for (int i = posicaoDoSinalMais - 1; i >= 0; i--) {
				num1ComoString.append(expressaoToda.charAt(i));

			}

			num1 = Double.parseDouble(inverterTexto(num1ComoString.toString()));
			System.out.println("Número 1: " + num1);

			for (int i = posicaoDoSinalMais + 1; i < expressaoToda.length(); i++) {
				num2ComoString.append(expressaoToda.charAt(i));
			}

			System.out.println("Valor da String toda: " + expressaoToda.toString());

			num2 = Double.parseDouble(inverterTexto(num2ComoString.toString()));
			System.out.println("Número 2: " + num2);

// resultado = num1 + num2;

		}
	});

	JButton botaoResultado = new JButton("=");
	botaoResultado.setBounds(janela.getWidth() - 380, 470, 350, 40);
	janela.add(botaoResultado);

	botaoResultado.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			textoCalcular.append(resultado);
			calculando.setText(textoCalcular.toString());
			System.out.println("Resultado :" + resultado);

		}
	});

	janela.setLayout(null);
	janela.setVisible(true);
}

public static String inverterTexto(String texto) {
	StringBuilder stringInvertida = new StringBuilder();
	for (int i = texto.length() - 1; i >= 0; i--) {
		stringInvertida.append(texto.charAt(i));
	}
	System.out.println("String invertida: " + stringInvertida.toString());

	return stringInvertida.toString();

}

}

Não parei para analisar onde está o erro, mas acho que dá pra simplificar algumas coisas. Por exemplo, pode muito bem ter um loop para adicionar as teclas, além de simplificar os listeners.

Essa é só uma versão básica, claro que ainda dá pra melhorar muita coisa, e deve ter vários casos que não testei (calculadora é mais complexo do que as pessoas imaginam, está cheio de detalhezinhos). Mas é só pra vc ter uma ideia de como poderia ser (o código tem comentários para te ajudar a entender):

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.function.BiFunction;
import javax.swing.*;

public class Principal {
    private static final StringBuilder op1 = new StringBuilder(), op2 = new StringBuilder(); // operandos
    private static boolean isOp1 = true, cleanBeforeAdd = false; // controlar qual operando atual e se deve limpar o display antes de adicionar algum caractere
    private static char op; // operação atual
    private static boolean decimal = false; // se já digitou o ponto
    private static final JTextField display = new JTextField("", SwingConstants.RIGHT);
    private static final int MAX_SIZE = 10; // quantidade máxima de dígitos
    // todas as teclas
    private static final String[] KEYS = new String[]{"AC", "+/-", "%", "/", "7", "8", "9", "x", "4", "5", "6", "-", "1", "2", "3", "+", "0", ".", "del", "="};

    static StringBuilder currentOp() {
        return isOp1 ? op1 : op2; // operando atual (o primeiro ou o segundo)
    }

    static void addDigit(String digit) { // adiciona um dígito ao display
        StringBuilder sb = currentOp();
        if (sb.length() == MAX_SIZE) {
            return;
        }
        try {
            if (cleanBeforeAdd) {
                cleanBeforeAdd = false;
                sb.setLength(0);
            }
            sb.append(digit);
            display.setText(sb.toString());
        } catch (Exception e) {
            // e.printStackTrace(); <-- se quiser logar o erro
        }
    }

    static void calc() {
        String result = "";
        if (op2.length() == 0) { // se não tem segundo operando, o resultado é o primeiro
            result = op1.toString();
        } else {
            // BigDecimal não tem os erros de arredondamento de double e float
            BigDecimal b1 = new BigDecimal(op1.toString());
            BigDecimal b2 = new BigDecimal(op2.toString());
            BiFunction<BigDecimal, BigDecimal, BigDecimal> func;
            switch (op) {
                case '+':
                    func = BigDecimal::add;
                    break;
                case '-':
                    func = BigDecimal::subtract;
                    break;
                case '/':
                    func = BigDecimal::divide;
                    break;
                case 'x':
                    func = BigDecimal::multiply;
                    break;
                case '%': // calcula y% de x
                    func = (x, y) -> {
                        return x.multiply(y.divide(BigDecimal.valueOf(100)));
                    };
                    break;
                default:
                    func = null;
            }
            if (func != null) {
                BigDecimal res = func.apply(b1, b2);
                // se o valor é inteiro, elimina as casas decimais (senão ele mostra "1.0" em vez de apenas "1")
                if (res.signum() == 0 || res.scale() <= 0 || res.stripTrailingZeros().scale() <= 0) {
                    res = res.setScale(0, RoundingMode.DOWN);
                }
                result = res.toString();
                if (result.length() > MAX_SIZE) { // se passou o tamanho do display, trunca
                    result = result.substring(0, MAX_SIZE);
                }
            }
        }
        display.setText(result);
    }

    private static void addListener(JButton button, final String key) { // adiciona o listener de acordo com a tecla
        button.addActionListener((ActionEvent e) -> {
            if (key.length() == 1) { // teclas com 1 caractere
                final char c = key.charAt(0);
                if (Character.isDigit(c)) { // é um dos números
                    addDigit(key);
                } else if (".".equals(key) && !decimal) { // ponto (mas não permite mais de um ponto, isso é controlado pela variável "decimal")
                    decimal = true;
                    StringBuilder sb = currentOp();
                    sb.append(".");
                    display.setText(sb.toString());
                } else if (c == '+' || c == '-' || c == 'x' || c == '/' || c == '%') { // uma das operações básicas
                    op = c;
                    isOp1 = false;
                    cleanBeforeAdd = true;
                } else if (c == '=') { // calcular e mostrar o resultado
                    calc();
                    clear();
                }
            } else if ("AC".equals(key)) { // limpar o display
                clear();
                display.setText("");
            } else if ("del".equals(key)) { // apaga o último caractere
                StringBuilder sb = currentOp();
                if (sb.length() > 0) { // se estiver vazio, não tem o que apagar
                    sb.deleteCharAt(sb.length() - 1);
                    display.setText(sb.toString());
                }
            } else if ("+/-".equals(key)) { // inverte o sinal do número atual
                StringBuilder sb = currentOp();
                if (sb.charAt(0) == '-') { // se é negativo, remove o sinal
                    sb.deleteCharAt(0);
                } else if (sb.length() > 0 && sb.charAt(0) != '0') { // senão, inverte o sinal, mas só se já tiver um número maior que zero
                    sb.insert(0, '-');
                }
                display.setText(sb.toString());
            }
        });
    }

    private static void clear() {
        op1.setLength(0);
        op2.setLength(0);
        op = ' ';
        isOp1 = true;
        cleanBeforeAdd = false;
        decimal = false;
    }

    public static void main(String[] args) {
        JFrame janela = new JFrame("Calculadora");
        janela.setSize(400, 600);
        int keySize = 60, initialX = janela.getWidth() - 290;
        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        janela.getContentPane().setBackground(Color.BLACK);
        for (int i = 0, x = initialX, y = 190; i < KEYS.length; i++) { // adiciona as teclas
            final String key = KEYS[i];
            JButton button = new JButton(key);
            button.setBounds(x, y, keySize, keySize);
            addListener(button, key);
            janela.add(button);
            if (i % 4 == 3) { // mudou a linha, x volta pro começo, y aumenta
                x = initialX;
                y += keySize + 10;
            } else { // mesma linha, x aumenta, y não muda
                x += keySize + 10;
            }
        }

        display.setFont(new Font(Font.MONOSPACED, 0, 50));
        display.setBounds(20, 60, 350, 100);
        display.setHorizontalAlignment(SwingConstants.RIGHT);
        janela.add(display);

        janela.setLayout(null);
        janela.setVisible(true);
    }
}
1 curtida