[gelöst] JAVA - String Manipulation

Hi,

mein Ziel ist es eine Textdatei vollständig auszulesen , das ganze dann in einem String abzuspeichern und anschließend in ein Char Array zu casten.
Ich habe dann letzendlich vor jeden Buchstaben um ein paar Stellen zu versetzen (Caesar Verschlüsselung ) und ich denke das macht am meisten Sinn mit einem Char Array.
Aber ich scheitere schon beim auslesen der Datei bzw. beim abspeichern in eine temporäre String Variable ...
Code:
try {
	   
	   File datei = new File ("Text.txt");
	   
	   Scanner sc = new Scanner ( datei );
	   
	   String charset = null;
	   String temp = null;
	   
	   
	   while ( sc.hasNext() ) { 
	   
	    temp = sc.nextLine();
	    charset.concat (temp);
		
	   }
	   
	   char [] array = charset.toCharArray ();
	 }
	
	catch ( Exception e ) {
	   System.err.println ( "Fehler Code: " + e.getMessage() );
	}
Mein Programm bricht immer ab mit der getMessage "null".
Komischerweise musste ich die String auch direkt mit = null initialisieren sonst kam immer dieser Fehler:
Code:
variable charset might not have been initialized charset.concat (temp);

Kann mir da wohl jemand helfen ? -.-
 
Das problem ist hier, dass du einen String als Nullpointer intialisierst und an diesen Pointer etwas anhängen willst. Das kann natürlich nicht funktionieren. Mach mal aus der Zeile:
String charset = null; String charset = ""; dann sollte es funktionieren.
 
Hmm jetzt kommt zwar keine Fehlermeldung aber es wird auch nichts an den String übergeben -.-
Also nachdem die Schleife durchgelaufen ist habe ich keinen Inhalt in dem charset ...

Aber wieso muss ich charset überhaupt gleich definieren ?
 
Concat veraendert den jeweiligen String nicht, es gibt nur den String plus die Erweiterung zurueck.

Code:
charset = charset.concat(temp);

Mit deiner Methode schießt du nur einen String in's Leere :)
Und definiert sollte er trotzdem sein.
 
Für String-Manipulation wäre auch die Klasse StringBuffer gut geeignet.
Im Gegensatz zu String ist StringBuffer nicht immutable (unveränderlich) und du kannst einfach String-Manipultaion wie Anhängen (append()), Ersetzen (replace()) oder Teilstring (substring()) direkt auf deinem StringBuffer Objekt ausführen, ohne jedesmal ein neues String-Objekt erstellen zu müssen.
Das spart Code, sieht intuitiver aus und läuft auch normalerweise schneller (bei vielen String-Manipulationen).

mfg, metax.
 
Vielen Dank für die Antworten , dann kann das so ja nicht klappen :>
Mit StringBuffer habe ich gestern auch schon rum experimentiert aber da kam leider auch kein sichtliches Ergebnis zu stande ... ich werde nun nochmal die Reference durchblättern.

Aber ich verstehe immer noch nicht ganz wieso ich charset sofort einen Wert zuweisen muss o0
 
Du kannst erst Methoden von charset aufrufen ( charset.concat, charset.toCharArray ), wenn charset ein Objet ist, welches diese Methoden implementiert.
Null ist kein Objekt.
Du musst also charset erst einen Wert (!= null) zuweisen, bevor du Methoden aufrufst oder Werte abfragst. Wenn du das alles machst, ohne überhaupt jemals einen Wert zuzuweisen (nichtmal null), dann meckert zusätzlich der Compiler ("variable charset might not have been initialized charset.concat (temp);");

Also: Falsch:
Code:
Object x;
x.method(); // Nullpointerexception!
y = x.memberVariable; // Nullpointerexception!

Richtig:
Code:
Object x = new ObjectX();
x.method(); // OK
y = x.memberVariable; // OK
Oder
Code:
Object x;
x = y.getObjectX();
x.method(); // OK
y = x.memberVariable; // OK
Oder
Code:
Object x;
...
if (x != null) {
x.method(); // OK
y = x.memberVariable; // OK
}

mfg, metax.
 
Wer "StringBuffer" nennt, sollte der Vollständigkeit halber auch "StringBuilder" erwähnen - den API-kompatiblen, Thread-unsicheren (und daher möglicherweise schnelleren) kleinen Bruder.
Was verwendet werden soll, musst du selbst entscheiden - ich empfehle dennoch den StringBuffer, solange die Performance nicht nachweislich genau dadurch zu sehr leidet.

/edit: Link korrigiert (thx PuppE)
 
Also bei meinen kleinen "Programmchen" ist die Performance doch eher nebensächlich :)
Ich habe gerade mal ein kleines Caesar Verschlüsselungs Programm geschrieben ...
Aber ich habe jetzt den StringBuffer aus Lernzwecken verwendet.
 
Zurück
Oben