Zum Inhalt springen

String::replace, String::replaceAll


laubi

Empfohlene Beiträge

hey leute, ich hoffe ihr könnt mir bei meinem kleinen Problem mit java helfen:

ich möchte in einem string alle elemente durch neue ersetzen, die "templates" sind in einer arrayliste gespeichert:

public class test{
[INDENT]

public class Color{[INDENT]

public String name;

public String color;


public Color(String name,String color{[INDENT]

this.name=name;

this.color=color;[/INDENT]
}

[/INDENT]}



ArrayList <Colors>colors=new ArrayList<Colors>();

public test(){
[INDENT]

this.colors.add(new Color("{red}","RED"));

this.colors.add(new Color("{blue}","BLUE"));

//...

[/INDENT]
}private String replaceColors(String msg){
[INDENT]for(int i=0; i<this.colors.size(); i++){[INDENT]while(msg.contains(this.colors.get(i).name){[INDENT]msg=msg.replace(this.colors.get(i).name,this.colors.get(i).color);[/INDENT]
}[/INDENT]}return msg;[/INDENT]}[/INDENT]}

nun kommt aber jedes mal wenn ich den code ausführe eine NullPointerException.

wie kann ich das am besten lösen?

und ich habe auch gedacht man kann die innere while schleife durch ein replaceAll ersetzen, allerdings kann ich das ja nicht mal testen weil es wie gesagt nicht funktioniert.

ich hoffe ihr könnt mir dabei helfen.

lg

Laubi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schließende Klammer fehlt.

Und das soll eine Nullpointer Exception liefern :D Wohl kaum. Da würd zuerst der Compiler dran scheitern!

Zum Thema:

An welcher Stelle fliegt die Nullpointer-Exception?



[COLOR="red"]ArrayList <Colors>colors=new ArrayList<Colors>();[/COLOR]


public test(){


    this.colors.add(new Color("{red}","RED")); this.colors.add(new Color("{blue}","BLUE"));


}

Pack die Initialisierung der Liste mal in den Konstruktor.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei Deinem Testcode ist noch einiges mehr im Argen als nur die Klammer. An dieser Stelle ignoriere ich mal, dass die Code Conventions verletzt werden.

Aber das hier dürfte nicht kompilieren:

ArrayList <Colors>colors=new ArrayList<Colors>();
Die Klasse Colors gibt es in Deinem Beispiel nicht, sondern nur Color.
while(msg.contains(this.colors.get(i).name){

Auch hier fehlt eine schließende runde Klammer.

Dein Code wirft keine Exception. Der kompiliert nicht einmal. Aber auch wenn man das korrigiert, wirft er keine Exception. Es ist wesentlich sinnvoller, wenn Du genau das Codebeispiel zur Verfügung stellst, das sich so verhält, wie Du angibst. Sonst können wir nämlich nur in die Glaskugel gucken.

Zudem wird bei einer Exception nicht ohne Grund die Zeile angegeben, die sie ausgelöst hat. Bitte darauf achten und vor allem hier mit angeben.

und ich habe auch gedacht man kann die innere while schleife durch ein replaceAll ersetzen, allerdings kann ich das ja nicht mal testen weil es wie gesagt nicht funktioniert.

Du kannst Die Schleife auch einfach gleich weglassen. Die Java API sollte Dein bester Freund sein. Das hier sagt sie zu replace:

public String replace(CharSequence target,

CharSequence replacement)

Replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence. The replacement proceeds from the beginning of the string to the end, for example, replacing "aa" with "b" in the string "aaa" will result in "ba" rather than "ab".

Beachte das Wörtchen "each".

Pack die Initialisierung der Liste mal in den Konstruktor.

Was soll das bringen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

bei deiner NullPointerException kann auch ich aus bereits genanntem Grund nicht helfen

allerdings würde ich dir folgende Codeänderungen empfehlen:

es ist nicht notwendig, eine eigene Klasse Color (oder Colors) zu verwenden (sofern sie nur für die Auflistung in einer ArrayList verwendet wird)

ich würde eher zu einer HashMap raten, welche Schlüssel-Wert-Paare speichern kann

dazu müsstest du in der for Schleife nicht mehr alle Color-Objekte, sondern alle Schlüssel durchgehen und ggf. den zugehörigen Wert

da du in der for Schleife die Daten der ArrayList nicht veränderst, könntest du genauso eine for each Schleife verwenden

der Kopf sähe wie folgt aus:

for(Color color:colors)

der Vorteil ist, dass man mit color Zugriff auf das aktuelle Objekt hat und nicht erst über die get-Methode (oder ind anderen Fällen über den Indexoperator) dieses Objekt abholen muss

dadurch wird der Code kürzer, übersichtlicher und verständlicher

(bei einer HashMap könnte man entsprechend die Schlüssel auf diese Art durchgehen)

ich hoffe, dass du deinen richtigen (?) Code besser formatierst (unter eclipse einfach ab und zu STRG+Umschalt+F drücken)

Sacaldur

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...