HOWTO · Java

Beheben Sie den unerwarteten Typfehler in Java

Dieses Tutorial demonstriert den unerwarteten Typfehler in Java.

Auf dieser Seite

In Java muss das Ziel einer Zuweisung eine Variable sein. Die Methode charAt(i) gibt einen Zeichenwert zurück. Deshalb kann ein Ausdruck wie DemoStr.charAt(i) nicht auf der linken Seite einer Zuweisung stehen. Weise das zurückgegebene Zeichen stattdessen einer Variable zu oder füge es dort hinzu.

Den Compilerfehler unexpected type verstehen

Die Diagnose unexpected type bezieht sich darauf, was ein Ausdruck an dieser Stelle tun kann. Im folgenden Beispiel liefert charAt(i) einen Wert; der Ausdruck bezeichnet keine Variable, deren Inhalt geändert werden kann. Die Compilerangaben required: variable und found: value weisen auf dieses Problem mit dem Zuweisungsziel hin und nicht auf einen Konflikt zwischen zwei deklarierten Datentypen. Ein Typkonflikt ist etwas anderes: Er liegt vor, wenn ein Ausdruck einen Typ hat, der an einer Stelle, an der ein anderer Typ erwartet wird, nicht verwendet werden kann. Hier ist entscheidend, welche Art von Ziel links von += benötigt wird. Eine Umwandlung oder eine andere Typdeklaration macht das Ergebnis eines Methodenaufrufs nicht zu einem zuweisbaren Ziel. Prüfe den Ausdruck direkt links vom Zuweisungsoperator und stelle fest, ob er einen veränderbaren Speicherplatz bezeichnet.

Den Fehler mit einer ungültigen Zuweisung reproduzieren

Der fehlerhafte Ausdruck im Beispiel zum Umkehren einer Zeichenfolge lautet DemoStr.charAt(i) += ReversedString;. Damit wird versucht, das von charAt zurückgegebene Zeichen zu ändern, doch das Ergebnis ist lediglich ein Wert. Eine Compilerdiagnose zu dieser Zuweisung gibt an, dass links eine Variable erforderlich ist, aber ein Wert gefunden wurde. Die genaue Formatierung der Compilerdiagnose kann variieren; diese Beschreibung ist daher kein wörtlich aufgezeichnetes Compilerprotokoll. Auch der Operator += benötigt ein beschreibbares Ziel, genau wie eine einfache Zuweisung mit =. Ein Methodenaufruf kann dazu dienen, ein Zeichen auszulesen, es zu vergleichen oder an eine andere Operation zu übergeben. Das zurückgegebene Zeichen ist jedoch kein benannter Speicherplatz in der ursprünglichen Zeichenfolge. Da Java-Zeichenfolgen unveränderlich sind, soll hier ein separates Ergebnis erstellt werden, statt ein Zeichen in DemoStr zu ändern.

Die Zuweisung an eine Variable richten

Lass das Ziel auf der linken Seite stehen und füge jedes von charAt(i) zurückgegebene Zeichen dort hinzu. Dieses vollständige Beispiel durchläuft die Quelle vom letzten bis zum ersten Index. Mit length() - 1 wird das letzte Zeichen ausgewählt; durch das Verringern von i wird jeder vorherige Index bis null besucht. So entsteht das Ergebnis in umgekehrter Reihenfolge, während die Quelle unverändert bleibt. Ist die Eingabezeichenfolge leer, beträgt der anfängliche Index -1; die Schleife wird dann kein einziges Mal ausgeführt und das Programm gibt eine leere Zeile aus.

Führe dieses Beispiel aus:

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);
    }
}

Ausgabe:

kcatstfled

Die entscheidende Korrektur besteht darin, dass die Zuweisung ReversedString ändert; charAt(i) liefert das anzufügende Zeichen. Bei längeren Zeichenfolgen kann wiederholte Verkettung viele Zwischenzeichenfolgen erzeugen. Die Schleife macht die Korrektur des Zuweisungsziels anschaulich; wenn viele Zeichen gesammelt werden, ist StringBuilder meist die bessere Wahl.

Eine Zeichenfolge mit StringBuilder umkehren

Für eine kürzere Lösung zum Umkehren kannst du aus der Quelle einen StringBuilder erstellen, reverse() aufrufen und das Ergebnis wieder in einen String umwandeln. Dies ist eine alternative Methode zum Umkehren und nicht erforderlich, um den Fehler mit dem Zuweisungsziel zu beheben.

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

Ausgabe:

kcatstfled

In beiden Beispielen lässt sich der von charAt(i) zurückgegebene Wert auslesen oder hinzufügen; eine Zuweisung muss dagegen auf eine Variable zielen. StringBuilder.reverse() kehrt den Inhalt des Builders um, und toString() gibt den resultierenden Text als gewöhnlichen String zurück. Wähle die Schleife, wenn du nachvollziehen möchtest, wie die Zeichen gesammelt werden, oder eine eigene Verarbeitung hinzufügen willst. Wenn du nur die Zeichenfolge umkehren möchtest, eignet sich die Builder-Variante. Keine der beiden Methoden weist einem Methodenresultat einen Wert zu.