Variablen Replace funktioniert nicht

Ananaskirsche

Aktives Mitglied
Hallo,
Ich habe eine Prozedur geschrieben:
Java:
String Output = Input.replace("joinMessage: ", "");

Input ist zu diesem Zeitpunkt "joinMessage: {player} joined the server" und als Output bekomm ich "{player} joined the server".

nun habe ich genau das selbe:
Java:
String Output = Input.replace("quitMessage: ", "");

Input ist zu diesem Zeitpunkt "quitMessage: {player} left the server" und als Output sollte ich bekommen "{player} left the server" aber stattdessen bekomme ich eine NPE und ich weiß nicht warum, zumal es ja bei der joinMessage funktioniert.
 
Hi,
Ich vermute mal, dass die INPUT- Instanz schon null ist, und du auf dieser Instanz die replace Methode aufrufst... Schliesst du irgendwo vorher die Verbindung oder so? Kannst du mal den code posten?

Gruss knilch
 
Zuletzt bearbeitet:
Java:
package filehandler;

import java.io.*;

public class TeamConfig
{
	//Erstellen der Virtuellen Datei
	private static String f = File.separator;
	private static File foulder = new File("plugins" + f + "ServerTeam");
	private static File teamFile = new File("plugins" + f + "ServerTeam" + f + "team.yml");
	
	//Erstellen der Output-Strings
	private String Input;
	private String Output;
	
	
	public String requestString(String request)
	{
		checkFile();
		try
		{
			//Erstellen der Reader
			FileReader reader = new FileReader(teamFile);
			BufferedReader r = new BufferedReader(reader);
			
			//Erstellen der Variable mit Zeilennummer
			byte zeile = 0;
			
			//Ertsellen des Zeilenzählers
			byte line = 0;
			
			
			
			//Bei den Zeilen immer noch 2 draufaddieren weil 2 Zeilen am Anfang hadder sind
			if(request == "Owner")
			{
				zeile = 3;
			}
			else if(request == "Admin")
			{
				zeile = 4;
			}
			else if(request == "Moderator")
			{
				zeile = 5;
			}
			else if(request == "Supporter")
			{
				zeile = 6;
			}
			else if(request == "Text")
			{
				zeile = 7;
			}
			
			
			//line wird so lange erhöht bis sie zeile entspricht
			while((Input = r.readLine()) != null)
			{
				line++;
				if(zeile == line)
				{
					r.close();
					break;
				}
				
			}
			
			//Filtert das passende Prefix aus dem Dateiinhalt raus um nur die eingabe des Users zu erhalten
			if(request == "Owner")
			{
				Output = Input.replace("Owner: ", "");
			}
			else if(request == "Admin")
			{
				Output = Input.replace("Admin: ", "");
			}
			else if(request == "Moderator")
			{
				Output = Input.replace("Moderator: ", "");
			}
			else if(request == "Supporter")
			{
				Output = Input.replace("Supporter: ", "");
			}
			else if(request == "Text")
			{
				Output = Input.replace("Text: ", "");
			}
		}
		catch(IOException ex)
		{
			System.err.println("[ServerTeam]Could not read out team.yml");
		}
		
		
		return Output;
	}
	
	
	
	public void checkFile()
	{
		if(!teamFile.exists() || !teamFile.isFile())
		{
			try
			{
				//Erstellen der Datei
				foulder.mkdirs();
				teamFile.createNewFile();
				
				FileWriter writer = new FileWriter(teamFile);
				BufferedWriter w = new BufferedWriter(writer);
				
				w.write("#==========[SERVERTEAM]==========\n");
				w.write("You HAVE to leave one space between the : and your names (e.g. Admin: Ananaskirsche)\n");
				w.write("Owner: No Owner\n");
				w.write("Admin: No Admin\n");
				w.write("Moderator: No Moderator\n");
				w.write("Supporter: No Supporter\n");
				w.write("Text: No Text");
				
				w.flush();
				w.close();
			}
			catch(IOException ex)
			{
				System.err.println("[ServerTeam] Could not create out team.yml");
			}
		}
//		else
//		{
//			System.out.println("[ServerTeam] team.yml exists");
//		}
	}
}


Ich muss noch anfügen dass Ich die falsche Methode genommen habe. Dies funktioniert:
Java:
if(request == "Owner")
			{
				Output = Input.replace("Owner: ", "");
			}
			else if(request == "Admin")
			{
				Output = Input.replace("Admin: ", "");
			}

Dies nicht mehr:
Java:
else if(request == "Moderator")
			{
				Output = Input.replace("Moderator: ", "");
			}
			else if(request == "Supporter")
			{
				Output = Input.replace("Supporter: ", "");
			}
			else if(request == "Text")
			{
				Output = Input.replace("Text: ", "");
			}

Wahrscheinlich ist das einer meiner Dummheitsfehler die man so einbaut wenn man Nachts coded 😉
 
Hi,
In der while- Schleife:
Java:
            //line wird so lange erhöht bis sie zeile entspricht
            while((Input = r.readLine()) != null)
            {
                line++;
                if(zeile == line)
                {
                    r.close();
                    break;
                }
               
            }
wird solange gelesen, bis (zeile == line) true ist. Dann hat INPUT der Wert, der von readLine eingelesen wurde.
Wenn aber zeile != line ist. dann wird so lange die readLine Methode angewandt, wie es Zeilen in der Stream hat. Wenn dann while beendet wird (d.h. nie zeile == line eingetroffen ist), dann ist INPUT NULL. (siehe readLine()) Methode: BufferedReader (Java Platform SE 7 ).
Dann willst du auf der Instanz INPUT die replace- Methode anwenden und bekommst NPE.

Bei allen Vergleichen von request
Java:
            if(request == "Owner")
            {
                zeile = 3;
            }
            else if(request == "Admin")
            {
                zeile = 4;
            }
            else if(request == "Moderator")
            {
                zeile = 5;
            }
            else if(request == "Supporter")
            {
                zeile = 6;
            }
            else if(request == "Text")
            {
                zeile = 7;
            }
und auch dem weiteren verwenden von request solltest du besser
Java:
request.equals("Text")
anwenden. Dies ist besser als der Vergleich mit "=="
Um das Problem mit der NPE zu beheben, musst du den Code so umschreiben, dass der Zugriff auf die INPUT- Instanz anders gelöst wird.

Zusätzlich ist noch zu erwähnen, dass br nur geschlossen wird, wenn (zeile == line). Dies darf nicht sein. br muss spätestens beim verlassen der Methode geschlossen werden, damit die FilePointer wieder freigegeben werden. Ansonsten bekommst du Probleme, wenn du wieder auf die Datei zugreifen möchtest, solange das Programm läuft.

Gruss knilch
 
Zuletzt bearbeitet:
So wie ich dass sehe würde es doch reichen wenn ich einfach in die if-Verzweigung der while-Schleife schreibe

Java:
Input = r.readLine();

Oder meinst du dass ich das ganze aus der Datei anders auslesen muss?
 
Zuletzt bearbeitet:
Hi,
Das ändert nichts. im while- Kopf steht INPUT = r.readLine() . hier wird die Line gelesen und dann der Variable INPUT zugewiesen. Wenn r.readLine() am Ende des stream angekommen ist, dann ist die Rückgabe von r.readLine() --> NULL. Diese wird dann an die Variable INPUT zugewiesen. Anschliessend wird überprüft INPUT != null --> diese ist false, also wird der while- Loop verlassen. Die Variable INPUT ist dann immer NULL. Die Variable INPUT wird nur einen wert haben, wenn der while- Loop abgebrochen wird. d.h. zeile == line.
 
Zuletzt bearbeitet:
:idea:

Danke, hab's jetzt verstanden. Da ich ja weiß welche benötigte Information in welcher Zeile steht, wäre es möglich das Problem mit dem LineNumberReader zu lösen, wenn ja wäre ein Beispiel freundlich.

Parallel dazu werde ich natürlich auch googlen und gucken 😉

Aber danke schonmal für deine Hilfe und Erklärung
 

Zurück
Oben