Concatenar Strings e usar substring()

Pessoal tenho duas Strings que vem nesse formato:
0038
25

Preciso que elas sejam apresentadas da seguinte forma: 003,825.
Então tentei fazer o seguinte:

System.out.println(peso1.substring(0, 3) + "," + peso1.substring(3, 4) + peso2);

Só que isso me retorna o seguinte erro:

StringIndexOutOfBoundsException: String index out of range: 3

Será que estou usando o substring errado?

Amigo, usei o código q vc postou, fiz isso

public class Teste {
	public static void main(String args[]) {
		String peso1 = "0038";
		String peso2 = "25";
		
		System.out.println(peso1.substring(0, 3) + "," + peso1.substring(3, 4) + peso2);
	}
}

E saiu isso:

003,825

Não deu exceção ou erro algum…

Cara não sei se isso tem a ver mas o todo do meu ambiente que preciso fazer isso é o seguinte:
Recebo em stream os dados de uma balança e é em cima desses dados que eu preciso dividir e concatenar.
Olha o meu código:

public void serialEvent(SerialPortEvent ev){
switch (ev.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] bufferLeitura = new byte[20];
try {
while ( entrada.available() > 0 ) {
nodeBytes = entrada.read(bufferLeitura);
}
String Dadoslidos = new String(bufferLeitura);
if (bufferLeitura.length == 0) {
System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1 ){
System.out.println("Apenas um byte foi lido!");
} else { 
    String peso1 = " ";
    String peso2 = " ";
    String pesoTotal = " ";
    
    if (teste == true){
         if (Dadoslidos.substring(0, 1).equals("0")){
              System.out.println(Dadoslidos.substring(0, 4));
              peso1 = Dadoslidos.substring(0, 4);
         }
         if (Dadoslidos.substring(3, 7).equals("0000")){
             System.out.println(Dadoslidos.substring(0, 2));
             peso2 = Dadoslidos.substring(0, 2);
             teste = false;
         }
    }
    
    //System.out.println(Dadoslidos);
    if(!peso2.trim().equals("")){
         System.out.println(peso1.substring(0, 2) + "," + peso1.substring(2, 3) + peso2);
    }
    
}
} catch (Exception e) {
    JOptionPane.showMessageDialog(null,
                    "Erro durante leitura! STATUS: " + e,
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
//System.out.println("Erro durante a leitura: " + e );
}
//System.out.println("n.o de bytes lidos : " + nodeBytes );
break;
}
}

Será que o ideal para jogar o valor para as variáveis é montar um método set e para resgatar um método get? Será que isso tem a ver?

Para complementar a minha dúvida :?:
Fiz os métodos get e set para as variáveis da seguinte forma:

public String setTextPeso1(String peso1){
    this.peso1 = peso1;
    return peso1;
}

public String setTextPeso2(String peso2){
    this.peso2 = peso2;
    return peso2;
}

public String getTextPeso1(){
    return peso1;
}

public String getTextPeso2(){
    return peso2;
}

Agora quando tento executar a minha rotina com esse código:

if (validaPeso == true){
         if (Dadoslidos.substring(0, 1).equals("0")){
              System.out.println(Dadoslidos.substring(0, 4));
              setTextPeso1(Dadoslidos.substring(0, 4));
         }
         if (Dadoslidos.substring(3, 7).equals("0000")){
             System.out.println(Dadoslidos.substring(0, 2));
             setTextPeso2(Dadoslidos.substring(0, 2));
             validaPeso = false;
         }
    }
    
    //System.out.println(Dadoslidos);
    if(!peso2.trim().equals("")){
         System.out.println(getTextPeso1().substring(0, 2) + "," + getTextPeso1().substring(2, 3) +
                 getTextPeso2());
    }

Ocorre o erro de NullPointerException. Isso é mesmo erro de que as variáves estão sem valor?

Vc teria q debugar melhor seu código, ams acho que é porque as variáveis não estão inicializadas sim… Põe alguns blocos try/catch ou verifique no trace da exceção gerada onde exatamente no seu código a exceção está sendo gerada…
Tente também exibir toda essa sua variável bufferLeitura usando um laço, pra ver se realmente tem algo dentro dela… Mesma coisa pro Dadoslidos

Falou!

Só uma curiosidade, mas por que seu método set tem o return se o método get já tem isso?

O comum é:

public void setTextPeso1(String peso1){
     this.peso1 = peso1;
}

E então usar os métodos get pra retornar o conteúdo dos atributos.

Coloca um try/catch e no catch coloca um printStackTrace() pra ver em que linha está dando o erro.

Valeu pessoal, ajeitei os métodos e agora tá funcionando legal.