HOWTO · Java

Solucionar el error de tipo inesperado en Java

Este tutorial demuestra el error de tipo inesperado en Java.

En esta página

En Java, el destino de una asignación debe ser una variable. El método charAt(i) devuelve un valor de tipo carácter, por lo que una expresión como DemoStr.charAt(i) no puede aparecer a la izquierda de una asignación. Asigna ese carácter devuelto a una variable o añádelo a ella.

Cómo entender el error de compilación unexpected type

El diagnóstico unexpected type indica qué puede hacerse con una expresión en esa posición. En el ejemplo siguiente, charAt(i) produce un valor; no identifica una variable cuyo contenido pueda modificarse. El mensaje del compilador required: variable y found: value señala este problema con el destino de la asignación, no una incompatibilidad entre dos tipos de datos declarados. Una incompatibilidad de tipos es otro problema: ocurre cuando una expresión tiene un tipo que no puede usarse donde se espera otro. Aquí, la pista es qué clase de elemento se necesita a la izquierda de +=. Cambiar una conversión de tipo o un tipo declarado no hace que el resultado de un método se pueda asignar. Busca la expresión que aparece justo a la izquierda del operador de asignación y comprueba si identifica un espacio de almacenamiento que pueda modificarse.

Reproducir el error con una asignación no válida

La operación que falla en el ejemplo de inversión de la cadena es DemoStr.charAt(i) += ReversedString;. Intenta modificar el carácter que devuelve charAt, pero ese resultado es solo un valor. El diagnóstico del compilador para esta asignación indica que a la izquierda se necesita una variable y se encuentra un valor. El formato del mensaje puede variar según el compilador, así que esta descripción no es una transcripción de una ejecución. El operador += necesita un destino modificable, igual que una asignación simple con =. Una llamada a un método puede servir para leer un carácter, compararlo o pasarlo a otra operación, pero el carácter devuelto no es una posición con nombre dentro de la cadena original. Las cadenas de Java son inmutables, por lo que en este caso hay que construir un resultado independiente en lugar de modificar un carácter de DemoStr.

Corregir la asignación para que apunte a una variable

Deja el destino a la izquierda y añade a él cada carácter que devuelva charAt(i). Este ejemplo completo recorre la cadena de origen desde el último índice hasta el primero. Empezar en length() - 1 selecciona el último carácter; al decrementar i, se visita cada índice anterior hasta llegar a cero. Así se construye el resultado en orden inverso sin modificar la cadena original. Si la cadena de entrada está vacía, el índice inicial es -1, por lo que el cuerpo del bucle no se ejecuta y el programa imprime una línea vacía.

Ejecuta este ejemplo:

public class AssignmentFix {
    public static void main(String[] args) {
        String DemoStr = "delftstack";
        String ReversedString = "";

        for (int i = DemoStr.length() - 1; i >= 0; i--) {
            ReversedString += DemoStr.charAt(i);
        }

        System.out.println(ReversedString);
    }
}

Salida:

kcatstfled

La corrección clave consiste en que la asignación modifica ReversedString; charAt(i) proporciona el carácter que se añade. En cadenas más largas, la concatenación repetida puede crear muchas cadenas intermedias. El bucle ayuda a entender cómo corregir el destino de la asignación, mientras que StringBuilder suele ser más adecuado para acumular muchos caracteres.

Invertir una cadena con StringBuilder

Para invertir una cadena de forma más breve, crea un StringBuilder a partir de la cadena original, llama a reverse() y convierte el resultado de nuevo en un String. Es una forma alternativa de invertir la cadena; no es necesario para corregir el error del destino de la asignación.

public class BuilderReverse {
    public static void main(String[] args) {
        String DemoStr = "delftstack";
        String ReversedString = new StringBuilder(DemoStr).reverse().toString();
        System.out.println(ReversedString);
    }
}

Salida:

kcatstfled

En ambos ejemplos, el valor que devuelve charAt(i) se puede leer o añadir, pero la asignación debe apuntar a una variable. StringBuilder.reverse() invierte el contenido del objeto StringBuilder, y toString() devuelve el texto resultante como un String normal. Elige el bucle si quieres ver cómo se acumulan los caracteres o necesitas aplicarles un procesamiento personalizado; elige StringBuilder si solo quieres invertir la cadena. Ninguna de las dos opciones asigna un valor al resultado de un método.