PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Server/Plugin Manager



MJA
01.02.2005, 14:18
Hi Leute.

Ich habe ein Problem beim Programmieren eines Java-Servers, den ich für die TCP-Kommunikation zwischen zwei Programmteilen benötige. Hier ist der Code:



import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

class Server
implements Runnable
{
public void run()
{
try
{
ServerSocket sv = new ServerSocket(4003);

while(true)
{
if(sv.accept() != null)
{
Socket s = sv.accept();
Client c = new Client(s);
}
}
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}


Das Problem ist, dass der Server keine Verbindung erstellt, selbst wenn sich ein Client connectet. Wenn ich allerdings die if-Abfrage weglasse gibt es sofort eine NullPointerException, da sv.accept() ja noch null ist, solange sich kein Client verbindet. Außerdem bin ich mir nicht sicher, ob es mit der Konstruktion die ich für den Server im Moment verwende möglich ist, das sich mehrere Clients verbinden und für jeden ein neues Exemplar der Klasse Client angelegt wird.
Danke.

Gruß, Jan.

MJA
01.02.2005, 14:25
Um den Zusammenhang besser zu verstehen hier ein kleiner Programmablauf (kleiner Tipp: das ist viel Text, nur der obere Absatz ist erstmal wichtig, weil in dem Teil des Programms der Fehler sitzt):

Die Hauptklasse RSS erzeugt einen neuen Thread, der der Server ist. Eigentlich sollte, wenn sich ein Client, also ein Plugin, verbindet ein neues Exemplar der Klasse Client erstellt werden. Diese Client Klasse bildet die "Kommunikationsschittstelle" für das Plugin. Am Anfang schickt das Plugin einen String "identety" an seine Schnittstelle, der seine ID beinhaltet. Die Client-Klasse leitet die ID (in Form eines Integers) und sich selbst an die Funktion registerPlugin() der Hauptklasse RSS weiter. registerPlugin() fügt einem Client Array nun an der id'ten Stelle den übergebenen Client hinzu (clientarray[id] = client). (So ist gewähleistet, das später auf die Schnittstelle eines bestimmten Plugins zugegriffen werden kann)

Die Client Klasse ist selbst auch ein Thread und startet sich nach dem registrieren des Plugins bei der Hauptklasse selbst. (siehe start())
Die überschrieben run()-Methode, aus dem Interface Runnable beinhaltet eine endlos-Schleife, die den Input vom Plugin abfragt. Herreinkommende Strings haben das Format "id+msg" (z.B. 00hallo) als die ersten beiden Stellen sind die ID des Plugins an den die Mittelung geht und alle nachfolgenden Stellen sind die Mitteilung. Der String wird genau in diese Bestandteile zerlegt und der Methode messagePlugin() in der Hauptklasse RSS übergeben. Diese greift auf den Client-Array wieder an der id'ten Stelle zu und ruft die sendMessage()-Methode des dort gespeicherten Clients auf. Der wiederrum leitet den Nachrichten-String über den Socket an das Ziel-Plugin weiter. So können die Plugins miteinander kommunizieren.

So, das soll der fertige Programmaufbau werden. Wie gesagt, das Problem besteht darin, das der Server-Thread eben kein Exemplar der Klasse Client erzeugt und so alles nicht funktioniert.

Gruß, Jan.

PicNick
01.02.2005, 14:26
Versteh von Java nur Bahnhof.
Aber fehlt mir da nicht ein "Listen" ? (wait client)
mfg robert

MJA
01.02.2005, 14:48
Ja, so hab ich mir das auch gedacht, allerdings hab ich keine Ahnung, wie sich das mit Java realisieren lässt, da es meines Wissens keine entsprechenden Listener für Sockets in Java gibt.

Gruß Jan.

PicNick
01.02.2005, 15:27
Wird wahrscheinlich in "Serversocket" irgendwie impliziert sein.
Nein, seh ich grad, das ist beim accept() dabei, das ist der blocker
Ich räum' jetzt das Feld für kluge Leute mfg

EDIT 2: Ich les, da gibt's ein open , sonst is nix mit accept

Hessibaby
01.02.2005, 15:29
Hi Jan,

tipps zum TCP-IP Stack unter Java gibt´s bei www.jcontrol.org.
Wenn ich die Codeschnipsel richtig interpretiere fehlt das Init vom Stack aber ich bin gerade erst beim Java-Einstieg mit dieser ELV-JControll Geschichte.

Gruß Hartmut

MJA
01.02.2005, 15:50
@Hessibaby: Ich muss zugeben, ich von dem, was du da geschrieben hast nich viel verstanden ;-) Was ist das Init vom Stack?? Hört sich für mich irgendwie kompliziert an... Auf jeden Fall glaube ich das es dafür eine recht simple Lösung geben muss, weil ich ja nur darauf warten muss, dass eine Verbindung besteht.

Weiß jemand ne Lösung dafür? Ich nehme dochmal an, das sind nicht mehr als vier Zeilen Code?!

Gruß Jan.

dirk_r
01.02.2005, 16:53
Hi,

accept() blockiert bis sich ein Client anmeldet und gibt dann einen Socket zurück.
Dein Code wartet auf zwei Clients, das erstemal in der if-Abfrage, das zweite mal innerhalb des Anweisungsblock der if-Abfrage.
Die if Abfrage ist also überflüssig, die NullPointerException muss eine andere Ursache haben.
Könnte z.B daran liegen, dass s und c lokale Objekte sind, die vom GarbageCollector gelöscht werden,
wenn der nächste Durchlauf der while Schleife einsetzt. Folgendes sollte also funktionieren:



import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

class Server
implements Runnable
{
public void run()
{
Client c;

try
{
ServerSocket sv = new ServerSocket(4003);

while(true)
{

c = new Client( sv.accept() );

}
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}


Damit du mehrere Clients bedienen kannst,
muss dein Client-Objekt einen neuen Thread erstellen, sollte also von Thread abgeleitet werden.

Gruß, Dirk

MJA
01.02.2005, 17:37
Hi.

Vielen Dank!
Client ist bereits ein Thread, soweit hab ich auch schon gedacht. ;-)
Das c eine lokale Variable war, war eigendlich Absicht, denn ich dachte, da jedes c unabhängig von dem davor/danach ist, macht es druchaus Sinn, dass c nach jedem Durchlauf gelöscht wird. Naja, ich werde das jetzt mit deinem Code ausprobieren. Danke nochmal!

Gruß Jan.

P.S.: Bei deinem Code fällt der Import von java.net.Socket übrigens weg ;-)

MJA
02.02.2005, 08:24
Hi.

Ich hab das jetzt ausprobiert. Leider war das nicht die Lösung, die NullPointerException besteht weiterhin. Aber das hattest du ja schon vermutet.
Ich hab mir das jetzt mal genauer angeguckt: Die Exception tritt immer dann auf, wenn die Verbindung hergestellt wird, also der ClientSocket eine Anfrage sendet. Die Ausgabe lautet:

Exception in thread "Thread-2" java.lang.NullPointerException
at main.Client.<init>(Client.java:23)
at main.Server.run(Server.java:18)
at java.lang.Thread.run(Thread.java:595)

Die betreffenden Zeilen sind in Client.java:

in = new BufferedReader(new InputStreamReader(s.getInputStream()));

Also die Initialisierung eines BufferedReader, der den InputStream des Sockets ausließt.

In Server.java:

c = new Client(sv.accept());

(siehe Oben)

und in java.lang.Thread:

public void run() {
if (target != null) {
target.run();
}
}

Letzeres finde ich recht seltsam?! Wenn ich das richtig verstehe gibt es also ein Problem beim starten des Threads? Ich hab hier jetzt mal den Code von Client.java hochgeladen:



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client
implements Runnable
{
private Socket s;
private Thread t;
private BufferedReader in;
private PrintStream out;
private int id;

public Client(Socket s)
{
try
{
s = this.s;
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintStream(s.getOutputStream());

String identety = in.readLine();;
id = Integer.parseInt(identety.substring(0,2));

start();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}

public final int getID()
{
return id;
}

public void sendMessage(String msg)
{
out.print(msg);
}

private void start()
{
RSS.registerPlugin(getID(), this);

t = new Thread(this);
t.start();
}

private void end()
{
try
{
RSS.unregisterPlugin(id);
s.close();
t.join();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
}

public void run()
{
try
{
while(s.isConnected() == true)
{
String input = in.readLine();
int tgid = Byte.parseByte(input.substring(0,2));
String msg = input.substring(2);
RSS.messagePlugin(tgid,msg,id);
}

if(s.isClosed() == true)
end();
else
run();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}


Wie man sieht implementiert Client.java das Interface Runnable, also ist es ein Thread.
Könnte das Problem darin bestehen, das ich ein neues Client-Object anlege, es aber nicht als Thread starte?

Naja, ich hoff mal mir kann da jemand weiterhelfen.
Danke.

Gruß, Jan.

dirk_r
02.02.2005, 08:40
Hi,

der Fehler müsste im Konstruktor von Client sein, die Zeile ist falsch:

s = this.s;

es müsste eigentlich folgendes richtig sein:

this.s = s;

Gruß, Dirk

MJA
02.02.2005, 08:41
Oh danke, ich probiers!
(Ich werd das einfach übersichtlicher machen in dem ich den übergebenen Socket cs (für ClientSocket) und den andern s nenne, also s = cs;)

Gruß, Jan.

MJA
02.02.2005, 08:47
Cool, es klappt! Also zumindest das eine ;-)
Es gibt jetzt beim herstellen der Verbindung keine NullPointerException mehr. Danke!
Jetzt gibt es wieder ein anderes Problem. :-( Wieder eine NullPointerException. Allerdings erst, wenn der oben erwähnte String "identitiy", der die ID des Plugins enthällt, gesendet wurde. Die Fehlerausgabe ist folgende:

Exception in thread "Thread-2" java.lang.NullPointerException
at main.RSS.registerPlugin(RSS.java:9)
at main.Client.start(Client.java:41)
at main.Client.<init>(Client.java:26)
at main.Server.run(Server.java:19)
at java.lang.Thread.run(Thread.java:595)

Da ich am Code von Client.java noch ein bisschen gewerkelt hab ist hier ein update:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client
{
private Socket s;
private Thread t;
private BufferedReader in;
private PrintStream out;
private int id;

public Client(Socket cs)
throws IOException
{
s = cs;
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintStream(s.getOutputStream());

id = Integer.parseInt(in.readLine());

start();
}

public final int getID()
{
return id;
}

public void sendMessage(String msg)
{
out.print(msg);
}

private void start()
{
RSS.registerPlugin(getID(), this);

t = new Thread(new Input());
t.start();
}

private void end()
throws IOException, InterruptedException
{
RSS.unregisterPlugin(getID());
s.close();
t.join();
}

class Input
implements Runnable
{
public void run()
{
try
{
while(s.isConnected() == true)
{
String input = in.readLine();
int tgid = Byte.parseByte(input.substring(0,2));
String msg = input.substring(2);
RSS.messagePlugin(tgid,msg,id);
}

if(s.isClosed() == true)
end();
else
run();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
}
}
}

Der wesentliche Unterschied besteht darin, das der Thread jetzt nicht mehr Client selber sonder eine Unterklasse, Input, ist.

Der betreffende Code aus RSS.java ist folgender:


private static Client clients[];

public static void registerPlugin(int id, Client client)
{
clients[id] = client;
}


Ich hoffe mir kann jemand helfen?
Danke.

Gruß, Jan.

MJA
02.02.2005, 17:15
Hi.

Ich wollte nochmal drauf hinweisen, dass ich meinen Beitrag editiert habe und dort das neue Problem beschrieben hab, weil ich alleine nicht damit klargekommen bin. Ich hab grade gesehen, dass immer noch das alte Beitragsdatum da steht.
Vielen Dank.

Gruß Jan.

dirk_r
02.02.2005, 17:46
Hast du denn irgendwo im Client die Initialisierung des arrays?
also sowas wie:

clients = new Client[43];

MJA
02.02.2005, 19:26
Oh nein!! Das hab ich vergessen ^^ Naja, jetzt funktioniert es! Danke!

Gruß, Jan.

MJA
16.02.2005, 14:15
Hi!

Ich hab wiedermal ein Problem mit meinem Java Programm. Hier schonmal ein Update von Client.java (hat sich aber nicht viel geändert):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client
{
private Socket s;
private Thread t;
private BufferedReader in;
private PrintStream out;
private int id;

public Client(Socket cs)
throws IOException
{
s = cs;
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintStream(s.getOutputStream());

id = Integer.parseInt(in.readLine());

start();
}

public int getID()
{
return id;
}

public void sendMessage(String msg)
{
out.print(msg);
}

private void start()
{
RSS.registerPlugin(getID(), this);

t = new Thread(this.new Input());
t.start();
}

private void end()
throws IOException, InterruptedException
{
RSS.unregisterPlugin(getID());
s.close();
t.join();
}

class Input
implements Runnable
{
public void run()
{
try
{
while(true)
{
if(s.isConnected() == true)
{
String input = in.readLine();
int tgid = Integer.parseInt(input.substring(0,2));
String msg = input.substring(2);
RSS.messagePlugin(tgid,msg);
}
else
end();
}

}
catch(IOException e)
{
System.err.println("Client: IOException - " + e.getMessage());
}
catch(InterruptedException e)
{
System.err.println("Client: InterrupedException - " + e.getMessage());
}
}
}
}

Immer wenn sich ein Plugin zum Server connected gibt Client.Input.run() eine IOExcpetion aus: Connection refused.
Der Fehler tritt in dem Block


if(s.isConnected() == true)
{
String input = in.readLine();
int tgid = Integer.parseInt(input.substring(0,2));
String msg = input.substring(2);
RSS.messagePlugin(tgid,msg);
}
auf. Hat jemand eine Idee wo das Problem liegt?

Gruß Jan

NumberFive
17.02.2005, 10:05
ich was ja nicht was du mit dem server machen willst.

aber guck dir mal den link in der mein fus zeile an vielleicht hats du
lust mit zumachen.

Gruß

MJA
17.02.2005, 15:37
Ich habe weiter oben schon geschrieben, was damit beabsichtigt ist. Aber ich fasse es einfach nochmal kurz zusammen. Das ganze ist ein Plugin-Manager auf TCP Basis. Die Clients verbinden sich mit dem Server und können dann über TCP Nachrichten an andere Plugins, den Roboter oder den Server senden.
Der Code von Client.java oben ist sozusagen das "Kommunikations-Interface" für ein Plugin. Wenn sich ein Plugin verbindet wird ein neues Exemplar der Klasse Client angelegt und in einem Array gespeichert. Das Plugin kann dann Zeichenketten an das ihr zugewiesene Exemplar der Client Klasse senden und das wiederum leitet das an den Server weiter, der das Verarbeitet/weiterschickt.
Der Block oben ist ein Thread, der sofort, wenn eine neue Nachricht vom Plugin reinkommt das der messagePlugin()-Methode des Hauptprogramms (RSS) über gibt.

Kann das Problem darin liegen, dass der Fehler auftritt, weil nicht sofort eine Nachricht reinkommt?

Gruß, Jan.

NumberFive
18.02.2005, 10:30
Hallo Mja,

sorry wenn ich was über lesen habe.
aber das was du da beschreibst haben Johannes und ich schon sehr Ähnlich realiesiert. Vielleicht guckst du einfach mal auf unserer HP vorbei.

Gruß

MJA
18.02.2005, 13:19
Hi No5!

Ja, ich hab mir mal eure Systemzeichnung angeguckt. Wir wollen das genauso machen. (zumindest sehr ähnlich) Das ist auch die vernünftigste Systemstruktur ;)
Ich werde mir vielleicht später mal überlegen ob ich bei euch mitmache (du hast ja schon gefragt) Ich bin im Moment noch kein besonders guter Programmierer, ich schreibe auch erst seit einem knappen halben Jahr.
Kann mir den jemand mit meinem konkreten Problem mal weiterhelfen? Wäre nett, danke.

Gruß Jan.

dirk_r
18.02.2005, 15:38
Es wäre gut zu wissen, bei welchem Methodenaufruf die Exception geworfen wird. Dazu könntest du z.B. im catch Block e.printStackTrace() aufrufen.

Ansonsten kann ich nur raten:
- sind Firewall ausgeschaltet bzw. Ports freigegeben ?
- läuft der Server wirklich bzw. wartet er wirklich auf eine Verbindungsanfrage mittels accept?

Gruß, Dirk

MJA
18.02.2005, 18:12
Also die Server Klasse ist immer noch so, wie weiter oben gepostet. Es wird auch definitiv eine Verbindung aufgebaut, denn im Array kommt ein Client an. Ich werd deinen Tipp mit e.printStrackTrace() mal ausprobieren. Sag dann wieder bescheid.
Danke.

Gruß, Jan.

MJA
19.02.2005, 14:30
So, jetzt hab ich die Ausgabe von e.printStackTrace:

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream. java:168)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(Strea mDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(Stream Decoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:1 83)
at java.io.InputStreamReader.read(InputStreamReader.j ava:167)
at java.io.BufferedReader.fill(BufferedReader.java:13 6)
at java.io.BufferedReader.readLine(BufferedReader.jav a:299)
at java.io.BufferedReader.readLine(BufferedReader.jav a:362)
at main.Client$Input.run(Client.java:66)
at java.lang.Thread.run(Thread.java:595)


Sagt mit persönlich nicht viel, außer das aus irgendeinem Grund die Verbindung vorzeitig beendet wird oder so... Vielleicht wäre in dem Zusammenhang der Code des Plugins, dass ich zum Testen benutze ganz nützlich. Ich pack den einfach mal hier rein:

Test.java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Test
{
private int id = 0;
private Socket s;
private PrintStream ps;
private BufferedReader br;

public Test()
throws IOException
{
s = new Socket("localhost",4003);
s.setKeepAlive(true);
ps = new PrintStream(s.getOutputStream());
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps.println(id);
}

private void sendMessage(String msg)
{
ps.println(msg);
}

public static void main(String args[])
{
try
{
Test t = new Test();
Thread i = new Thread(t.new Input());
Thread o = new Thread(t.new Output());
}
catch(IOException e)
{
System.err.println(e.getMessage());
}
}

class Input
implements Runnable
{
public void run()
{
try
{
while(true)
{
System.out.println(br.readLine());
}
}
catch(IOException e)
{
System.err.println(e.getMessage());
}
}
}

class Output
implements Runnable
{
private BufferedReader r;

public Output()
{
r = new BufferedReader(new InputStreamReader(System.in));
}

public void run()
{
try
{
while(true)
{
sendMessage(r.readLine());
}
}
catch(IOException e)
{
System.err.println(e.getMessage());
}
}
}
}

Ich hoffe mir kann jetzt jemand weiterhelfen?

Gruß, Jan.

dirk_r
20.02.2005, 11:37
Hallo,

das Test-Objekt t wird bei verlassen des try-Blocks zerstört und damit auch die enthaltenen Verbindungen. Es muss also vor dem try-Block definiert werden. Ausserdem könnte es sein, dass nach dem Erstellen der Threads die Main Methode verlassen wird und dabei auch das Objekt zerstört wird. Versuch mal eine Endlosschleife am Ende der Main Methode.



public static void main(String args[])
{
Test t = new Test(); // hier ist das Objekt die ganze Main-Methode lang vorhanden
try
{

Thread i = new Thread(t.new Input());
Thread o = new Thread(t.new Output());
}
catch(IOException e)
{
System.err.println(e.getMessage());
}
while(true)
{
; //Endlosschleife
}

}

MJA
21.02.2005, 10:36
Gut, danke. Das hätte ich nicht gemerkt :D
Ich meld mich, wenns wieder was gibt.

Gruß, Jan.

NumberFive
22.02.2005, 00:02
hallo MJA

du kannst mal die mc als partner nehmen dann weiß du wo der fehler ist sender oder empfänger.

Connection refused. komm auch dann wenn der server nich auf dem port
hört zu dem du dich conneten willst was ist den dein server ?

kannst du dich auf den server per Hyperterminal oder telnet connecten ?

Gruß

MJA
02.03.2005, 08:47
Hi.

Ich hab jetzt noch mal "ganz von vorne" angefangen. Aber ich hab das System und so vom alten übernommen und auch weite Teile des Codes, bloß hab ich einiges geändert/verbessert. Und bin eigendlich schon wieder fast so weit wie vorher.
Das Problem bestand bestimmt nicht darin, dass der Server am falschen Port gehorcht hat.
Ne, dirk_r hatte schon Recht, das Objekt wurde nach dem try-Block zerstört.
Ich stehe mittlerweile vor einem neuen Problem, aber das versuche ich erstmal alleine zu lösen.

Gruß, Jan.

MJA
02.03.2005, 09:19
Hi.

Eine kleine Frage hab ich doch: Und zwar hab ich den Array String s[]. Der hat sagen wir die Länge 4. Jetzt möchte ich alle Strings daraus extrahieren bis auf s[0]. Das soll aber für alle Arrays mit beliebiger Länge funktionieren. Also einfach eine Methode, die aus einem beliebig langen Array alle Argumente außer s[0] extrahiert. Das muss irgendwie über s.length() gehen denk ich mal. Mit einer Schleife oder so. Kann mir da kurz jemand helfen?

Gruß

MJA
02.03.2005, 10:16
Funktioniert folgende Lösung?:


public String[] getArguments(String input) {

String s[] = input.split("-");

String output[] = new String[s.length-1];

for(int i = 1; i < s.length; i++)
output[i-1] = s[i];

return output;
}

Ich hoffe das geht?

Gruß, Jan.

Edit: Ich habs ausprobiert, es geht. Das Problem ist gelöst.

MJA
05.03.2005, 09:08
Hi.

Kann mir jemand sagen, wo hier eine NullPointerException auftritt:


public class Array
{
public static void main(String args[])
{
String s[] = new String[20];
String name = "a";

s[0] = "b";
s[1] = "c";
s[2] = "d";
s[3] = "e";
s[4] = "d";
s[5] = "f";
s[6] = "g";
s[7] = "h";
s[9] = "i";

byte i = 0;
while(s[i].equals(name) == false && i < s.length)
i++;

if(s[i].equals(name) == true)
System.out.println(i);
else
System.out.println("-1");
}
}

Wäre nett. Also Eclipse sagt in Zeile 19 also bei der while-Schleife. Aber ich versteh nicht warum? Wenn es keine Übereinstimmung in dem Array gibt sollte er die Schleife doch einfach beenden?

Gruß, Jan.

dirk_r
05.03.2005, 09:23
Hallo,

die while-Schleife wird verlassen, weil irgendwann i==s.length, also 10, ist.
In der nächsten Zeile greifst du dann auf s[10] zu.
Das sollte aber eine OutOfBoundsException und keine NullPointerException werfen. Der eigentliche Fehler wird daher wohl sein, dass du s[8] nicht initialisierst.

Gruß, Dirk

MJA
05.03.2005, 11:11
Hi.

Geht dann zur Lösung der NullPointerException folgendes:

byte i = 0;
while(s[i] != null && s[i].equals(name) == false && i < (s.length - 1))
i++;

if(s[i] != null && s[i].equals(name) == true)
System.out.println(i);
else
System.out.println("-1");?



die while-Schleife wird verlassen, weil irgendwann i==s.length, also 10, ist.
In der nächsten Zeile greifst du dann auf s[10] zu.
Muss ich die Bedingung auf i < (s.length - 1) setzen oder einfach statt "i++" "++i" schreiben?

Gruß, Jan.

dirk_r
05.03.2005, 13:57
Deine Lösung für die NullPointerException sollte funktionieren, ist aber irgendwie nicht gerade schön.
Bei der letzten Bedingung könntest du tatsächlich mit length-1 arbeiten. Ich würde den ganzen Block aber irgendwie anders schreiben.
Zum Beispiel mit einer for-Schleife:



public class Array
{
public static void main(String args[])
{
String s[] = new String[20];
String name = "a";

s[0] = "b";
s[1] = "c";
s[2] = "d";
s[3] = "e";
s[4] = "d";
s[5] = "f";
s[6] = "g";
s[7] = "h";
s[8] = "i";
s[9] = "j";

int i=0;

int foundAt = -1;

for( i=0; i<s.length(); i++)
{
if(s[i].equals(name))
{
foundAt = i;
break; //könnte man auch weglassen
}
}


System.out.println(foundAt);

}
}


Gruß, Dirk

MJA
05.03.2005, 17:45
Hi.

Stimmt, deine Lösung ist eleganter. Allerdings waren da die beiden Probleme von oben noch nicht weg, aber das hab ich noch gemacht. Danke!

(Hier nochmal der aktuelle Code:)

public class Array
{
public static void main(String args[])
{
String s[] = new String[10];
String name = "a";

s[0] = "x";
s[1] = "g";
s[2] = "e";
s[3] = "b";
s[4] = "s";
s[5] = "i";
s[6] = "k";
s[7] = "r";
s[8] = "a";
s[9] = "p";

byte index = -1;

for(byte i = 0; i < (s.length - 1); i++)
{
if(s[i] != null && s[i].equals(name) == true)
{
index = i;
break;
}
}

System.out.println(index);
}
}

Gruß, Jan.

MJA
08.03.2005, 11:39
Hi.

Es ist soweit ich habe wieder mal ein Problem. Diesmal ist es keine richtiges Problem, aber ich habe eine Lösung und die ist eigendlich zu kompliziert. Ziel ist es einen Array zu bekommen, der genau so lang ist, wie ein anderer intialisierte Elemente hat und dann den neunen mit diesen Elementen zu füllen. Ich gehe im Beispiel davon aus, das nicht alle Elemente des Ursprungsarrays intialisiert sind und das diese nicht direkt hintereinander liegen. Hier ist meine Lösung, sie funktioniert, gefällt mir aber überhaupt nicht:

String value[] = new String[10];
value[2] = "df";
value[4] = "aasda";
value[0] = "ssed";
value[6] = "sdsds";
value[9] = "aewaas";

int i = 0;
for(int x = 0; x < value.length; x++)
if(value[x] != null)
i++;

String result[] = new String[i];
i = 0;
for(int x = 0; x < value.length; x++)
if(value[x] != null)
result[i++] = value[x];
Ich glaube man könnte das einfacher mit einem Vector machen, aber ich hab keine Ahnung, wie die funktionieren. Vielleicht kann mir auch dazu jemand helfen?
Danke schonmal!

Gruß, Jan.

MJA
09.03.2005, 17:08
Hi.

Ich habe mir das mit den Vectoren jetzt nochmal in der Java-Documentation durchgelesen, das ist echt die bessere Lösung.
Ich hab dann gestern versucht die Arrays durch Vectoren zu ersetzen, aber dann hat Eclipse einen kritischen Hinweis rausgegeben, nämlich das ich die Vectoren irgendwie parametrisieren soll. Ich aber keine Ahnung wie und was überhaupt genau gemeint ist. Wenn ich das richtig verstehe soll ich eine Klasse von Vector erben lassen und die dann auf einen Dateitypen spezialiseren oder so... bin mir aber nicht sicher...
Kann mir jemand sagen, was gemeint ist und wie das funktioniert? Danke.

Gruß, Jan.

11.03.2005, 19:45
Hallo Leute.

Hätte da mal ein großes anliegen an Euch.
Und zwar such ich die JAVA Files für den Java MSN Messi.
Würde den gern in meine Website mit einbauen wollen.
Könnt ihr mir da helfen ?

Gruß Maik