PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NullPointerException bei Zugriff auf String[]



Pfanni
05-04-2003, 14:29
Hallo,

ich muss hier als JAVA Newbie ein kleines Projekt machen und stehe jetzt vor einem großen Problem.
Als Vorgabe habe ich eine abstrakte Basisklasse von der ich selber eine abgeleitet habe und darin Methoden schreibe. Nun bin auf das Problem gestoßen, dass ich in ein String[] den Inhalt eines anderen String[] eines bestimmten Index speichern möchte. Ich bekomme aber dabei nur NullPointerException. Woran kann dies liegen? Bin schon am Verzweifeln. Wäre dankbar für jeden Tipp. Im weiteren Verlauf des Programm sind auch noch String[][] gepalnt, ich denke mal, dass ich da dann auf das gleiche Problem stoßen werde.
Der Sinn vom dem Programm ist die Implementierung eines Kartenspiel mit einem Moderator, der die Nachrichten verteilt. Vom Moderator kommt ein String, den ich zerlege und dann einzelne Teile davon analysieren muss um eine Aktion auszulösen.
Habe mal einiges andere raus gelöscht um den Code kürzer zu machen.


meine eigene Klasse:

in dem String Array das ich der Methode "namesMessage" als Input gebe steht folgendes in an den einzelnen Indexwerten

names!
Name1
name2
Name3
Name4

dies soll nun ohne das Element names! in ein neues String[] kopiert werden, das demnach um einen Indexwert kleiner ist.



public class MrProper extends InkognitoPlayerBase {

static private String[] names = new String[4];


MrProper(int port){
super(port);
}


/** Process Methode.
* Hier wird der vom Moderator übergebene String analysiert und ein Ergebnis zurückgegeben.
* @param request , der String in dem alle übergebenen Informationen und Anfragen om Moderator stehen.
*/
String process(String request) {

String message = splitString(request)[0];

if(message.equals("names!")){
namesMessage(splitString(request));
return null;
}


else
return null;
}


void namesMessage(String[] playernames){

for(int i = 0; i<playernames.length; i++){

names[i] = playernames[i];
}

}





//++++++++++++++++++++ Hilfsmethoden ++++++++++++++++++++

String[] splitString(String request){

return request.split(" ");
}



public static void main(String[] args) {
new MrProper(args.length == 0? 6201: Integer.parseInt(args[0]));
}

}






die abstrakte Basisklasse



import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;

InkognitoPlayerBase
{
/** Default-Konstruktor.
* Der Player akzeptiert Verbindungen vom Moderator auf Port 6201.
*/
protected InkognitoPlayerBase()
{
this(6201);
}

/** Custom-Konstruktor.
* Der Player akzeptiert Verbindungen vom Moderator auf Port 'port'.
* @param port Netzwerkport, auf dem Verbindungen vom Moderator angenommen werden.
*/
protected InkognitoPlayerBase(int port)
{
// Logdatei oeffnen, wenn moeglich; ansonsten bleibt es bei log == null.
try
{
log = new PrintStream(new FileOutputStream("inkognito-"
+ new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date())
+ "." + port
+ ".log"));
}
catch(IOException ex)
{
System.err.println("Cannot write log file - logging disabled");
log = null;
}

// Startmeldung in die Logdatei.
log("log start");

// Initialisierungen
init();

// Kommunikation mit dem Moderator
try
{
System.out.print("waiting for a connection ... ");
System.out.flush();

// Serverport oeffnen
ServerSocket serverSocket = new ServerSocket(port);

log("listening on port " + port);

// Requestschleife; Wird 1x pro Verbindung durchlaufen
while(true)
{
// Warten auf Verbindung
Socket connection = serverSocket.accept();

// Anfrage lesen
String request = new BufferedReader(new InputStreamReader(connection.getInputStream())).re adLine();

// Bei 'exit' abbrechen; der Moderator schliesst die Verbindung
if("exit".equals(request))
{
log("moderator terminates");
connection.close();

// Ende der Requestschleife
break;
}

// Wenn Text gekommen ist: verarbeiten
if(request != null)
{
log("-> " + request);

// Nachricht beantworten
String response = process(request);

// Nicht-leere Antworten protokollen
if(response != null)
log("<- " + response);

PrintWriter writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream()));
writer.println(response);
writer.flush();
}
else
{
// Ping vom Moderator
log("connection ok");
System.out.println("connected!");
}

connection.close();
}
}
catch(IOException ex)
{
// da ging was schief mit der Netzwerkkommuniaktion
log("IOException: " + ex.getMessage());
ex.printStackTrace();
}

// Protokoll schliessen
log("log end");
if(log != null)
log.close();

System.out.println("program ends.");
}

/** Wird beim Start des Players vor Oeffnen des Serverports aufgerufen
* Das ist eine leere Default-Version.
* Kann von abgeleiteten Klassen redefiniert werden,
* um Datenelemente zu initialisieren.
*/
void init()
{

}

/** Fuegt den String 'msg' samt Zeitmarke an die Protokolldatei an.
* @param msg Text der an die Protokolldatei angefuegt wird.
*/
protected void log(String msg)
{
if(log == null)
return;

log.print(dateFormat.format(new Date()));
log.print(" ");
log.println(msg);
log.flush();
}

/** Wird mit allen Nachrichten vom Moderator aufgerufen.
* Bei Requests ist die Antwort fuer den Moderator als Ergebniswert
* zurueckzuliefern.
* Bei Messages wird null zurueckgegeben.
* @param request String der vom Moderator geschickt worden ist.
* @return Bei Requests Antwort an den Moderator oder null bei Messages.
*/
abstract String process(String request);

/** Logdatei. */
private PrintStream log = null;

/** Ausgabeformat fuer Zeitmarken in der Logdatei. */
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}

peschmae
05-04-2003, 16:02
hoffentlich habe ich das richtig kapiert:

names ist ein Element kürzer als playernames (wieso ist die Länge übrigens fix auf 4, das sollte doch eher dynamisch an playernames angepasst werden!)

also sollte doch das:


void namesMessage(String[] playernames){

for(int i = 0; i<playernames.length; i++){

names[i] = playernames[i];
}

}


irgendwie so aussehen:


void namesMessage(String[] playernames){
names = new String[playernames.length-1]; //neuer String[] mit richtiger Länge

for(int i = 0; i<names.length; i++){

names[i] = playernames[i+1];
}

}


MfG Peschmä

P.S. wo gibts die NullPointerException und was ist null???

Pfanni
05-04-2003, 20:08
@peschmae
danke für den Tipp mit dem +1 - war wohl nen kleiner Denkfehler von mir.

War aber nicht das eigentliche Problem, da er ja schon vorher hängengeblieben ist.

aber ich hab jetzt doch ne Lösung gefunden. Hab den ganzen Code noch mal mehr oder weniger neu geschrieben, da ich auf Eclipse umgestiegen bin und siehe da der Fehler ist weg - keine Ahnung was ich falsch gemacht habe aber ist mir eigentlich jetzt auch egal. Lag wohl irgendwie in der Variablendefinition. Da hab ich mit meinen beschränkten Newbiekenntnissen wohl was übersehen was ich beim zweiten mal richtig gemacht habe:D :) :)

Gruß
Pfanni