Set + Iterator oder doch nur zu blöd API zu lesen

Status
Nicht offen für weitere Antworten.

noobster

Aktives Mitglied
HI folgendes problem ich möchte bei einem server den ich auf javabasis erweitern kann die liste der "sharedObjects" abfragen dies sind objecte die in binärformat gespeichert werden und wohl hashmaps enthalten, wie auch immer mir gehts nur um die list der namen der objekte!

vorab der API ausschnitt bei dem es um den fraglichen befehl geht:
getSharedObjectNames

public Set<String> getSharedObjectNames(IScope scope)

Description copied from interface: ISharedObjectService
Get a set of the shared object names.

Specified by:
getSharedObjectNames in interface ISharedObjectService

Parameters:
scope - the scope to return the shared object names from
Returns:
set containing the shared object names

auch unter den genannten kopien steht nicht mehr.

eingebunden habe ich das ganze so🙁siehe kommentare als info)

Code:
package demo;

import ......

public class Application extends ApplicationAdapter {//aplicatioAdapter enthält die fragliche methode
	
private Set<String> mySet;//erstellen einer variable fürs set 

public boolean roomStart(IScope room) {//@Override überschreibt methode des Servers in ApplicationAdaptor
    if (!super.roomStart(room))
        return false;
    
    createSharedObject(room, "sampleSO", true);//erstellt so ein SharedObject
    ISharedObject so = getSharedObject(room, "sampleSO");//und refferenziert es
    
    IConnection conn = Red5.getConnectionLocal();//intern um die verbindung (läuft über rtmp) zu ermitteln
    IClient client = conn.getClient();//und den client eigentlich nicht notwendig
    IScope scope = room.getScope();//scope holen
    
    mySet = Set<String> getSharedObjectNames(IScope scope);// hier sagt mir eclipse dann ich solle das TOKEN scope entfernen danach das IScope und dann nach und nach den rest der zeile
    
    return true;
   
}

  public String getSOList()//hier die funktion lässt sch vom client aufrufen
	{
		String elementList = "Elements: ";//einen string erstellen um das ganze auch typ konform zurück zu geben
		try {//hatte es zuerst ohne try aber ohne den try catch block habe ich 
	  Iterator it = mySet.iterator();//<<<<<<hier  eine NUllPointerException welche ich später an den client ausgebe(damit ich nicht immer log file lesen muss
	  while (it.hasNext()) {//mit dem iterator durch das set das falls das nicht leer ist was es nicht sein dürfte da ich ein SharedObject erstellt habe
	        // Get element
	        Object element = it.next();
	        elementList = elementList + "" + element;
	    }
		} catch (NullPointerException E){
			elementList = E.toString();
		}
	return elementList.toString();//hier dann die ausgabe
	}
  
}

das ist jetzt der aktuelle code aber ich habe auch noch bestimmt 80 andere versionen wo ich so ziemlich alles versucht hab was ich gefunden hab...


das problem macht so oder so wohl wirklich diese Zeile:

Code:
 mySet = Set<String> getSharedObjectNames(IScope scope);


die ich wohl zu blöd bin synthaktich richtig zu schreiben, ich hab alles durch was mir eingefallen ist und hänge nun seit tagen an dieser einen zeile, vielleicht fällt ja dem geübten API leser sofort mein fehler ins auge, das wäre super aber auch für andere anregungen wäre ich sehr dankbar.

mfg
 
Wie kommst Du denn auch auf so eine Zeile? Seit wann schreibt man denn rechts vom Komma bei einer Zuweisung nochmal den Typ hin? Sowas macht man eigentlich nur, wenn man den Rückgabewert der Methode in einen anderen Typ casten will, und selbst dann würde dieser Typ in Klammern stehen. Das ist aber in Deinem Fall nicht nötig, weil der Typ von mySet und der Rückgabetyp der Methode identisch sind.

Desweiteren gibt man natürlich auch bei den Parametern eines Methodenaufrufs nicht erneut den Typ mit an sondern übergibt einfach ein konkretes Objekt.

Also gehts einfach so:

Code:
Set<String> mySet;

...
IScope scope = room.getScope();
mySet = getSharedObjectNames(scope);

Ich wundere mich um ehrlich zu sein, wie Du den Code darüber hinbekommen hast? Denn da hast Du es ja richtig gemacht...
 
Danke für die antworten aber

hab ich beides schon durch :
Code:
   mySet = (Set<String>) getSharedObjectNames(scope);
und
Code:
    mySet =  getSharedObjectNames(scope);

ergeben beide NullPointerExcepption im späteren Iterator,

bei dem zweiten bekomm ich in Eclipse die Meldung das er nicht von Typ Iterator in den typ Set parsen kann und schlägt mir die Methode mit dem casten vor.

schreibe ich das in Klammern übergebene gar so...(wie es in der API steht)...:

Code:
... getSharedObjectNames(IScope scope);

meckert eclipse bei beiden das ich das Token "scope" entfernen soll....

und sorry wenn die synthax chaotisch ist aber ich bin noch beginner und versuche mein bestes.
Java ist, für mich, keine einfache Sprache.

mfg
 
Was aber nicht heißt, das die Zuweisung fehlerhaft war; die war schon richtig.

Deine NullPointerException muß einen anderen Grund haben.

das schliesse ich auch nicht aus, nur welchen.

mindestens ein SharedObject ansich gibt es, das wurde ja oben zuvor erstellt.

vielleicht erhählt die funktion den falschen "scope"?, gibt es sonst noch möglichkeiten?

btw.
die fehler sind nun alle weg, bzw Eclipse beschwehrt sich nicht mehr.....
nachdem ich noch eine jar aus dem springframework ins project genommen habe verschwanden die eclipse fehlermeldungen aber tun tut sich noch immer nix.

sonst noch wer ideen oder mutmassungen?

mfg
 
Die NPE kommt daher, das mySet nicht initialisiert ist. Du hast weder einen Konstruktor noch sonst eine Zuweisung, und offensichtlich liefert dein 'getSharedObjects()' null zurück. Kann man aber ohne den restlichen Code nur raten.
 
Code:
Iterator it = mySet.iterator();

Wann gibts hier wohl eine NullPointerException? Richtig, wenn mySet null ist. Du setzt mySet in der Methode roomStart() und verwendest sie es dann in Methode getSOList(). Du musst also zunächst mal sicherstellen, dass roomStart auch immer aufgerufen wird, bevor Du getSOList aufrufst, denn sonst ist mySet noch null und es gibt ne Exception.

Eine andere Möglichkeit wäre, dass getSharedObjectNames null zurückliefert.


Ich empfehle Dir aber eher, Dich zuvor erstmal genauer mit der Java Syntax zu beschäftigen. Denn die erste Frage hat mir schon gezeigt, dass es Dir noch an ganz anderen Stellen fehlt. Lern erstmal die Basics, bevor Du Dich mit solch komplexeren Aufgaben beschäftigst.
 
das ist der geammte code (meiner klasse) den restlichen verteilt sich auf unzählige klassen des servers


Code:
package demo;
import org.red5.server.api.Red5;
import java.util.Iterator;
import java.util.Set;
import java.lang.String;
import org.red5.server.api.IScope;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.so.ISharedObject;

public class Application extends ApplicationAdapter {
	
 Set<String> mySet;

public boolean roomStart(IScope room) {
    if (!super.roomStart(room))
        return false;
    
    createSharedObject(room, "sampleSO", true);
    ISharedObject so = getSharedObject(room, "sampleSO");
    
    IConnection conn = Red5.getConnectionLocal();
    IClient client = conn.getClient();
    IScope scope = conn.getScope();
    
    mySet =  (Set<String>) getSharedObjectNames(scope);
    return true;
   
}

  public String getSOList()
	{
		String elementList = "Elements: ";
		try {
	  Iterator it = mySet.iterator();
	  while (it.hasNext()) {
	        // Get element
	        Object element = it.next();
	        elementList = elementList + "" + element;
	    }
		} catch (NullPointerException E){
			elementList = E.toString();
		}
	return elementList.toString();
	}
  
}


ich dachte die initialisierung mache ich weiter oben mit dieser zeile
Code:
 Set<String> mySet;

um das auch weiter unten in meiner getSOList() zur verfügung zu haben ... ich bau das mach nach unten und melde mich sofort wieder.

mfg
 
Kann mich Byto nur anschließen - der Unterschied zwischen Deklaration und Initialisierung sollte einem schon geläufig sein 😉
 
hmm ok die NPE ist weg


Code:
package demo;
import org.red5.server.api.Red5;
import java.util.Iterator;
import java.util.Set;
import java.lang.String;
import org.red5.server.api.IScope;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.so.ISharedObject;

public class Application extends ApplicationAdapter {
	
 Set<String> mySet;

public boolean roomStart(IScope room) {
    if (!super.roomStart(room))
        return false;
    
    createSharedObject(room, "sampleSO", true);
    ISharedObject so = getSharedObject(room, "sampleSO");
    
    return true;
   
}

  public String getSOList()
	{
		String elementList = "Elements: ";
		try {
		    IConnection conn = Red5.getConnectionLocal();
		    IClient client = conn.getClient();
		    //IScope scope = conn.getScope();
		    
		    mySet =  (Set<String>) getSharedObjectNames(IScope scope);
	  Iterator it = mySet.iterator();
	  while (it.hasNext()) {
	        // Get element
	        Object element = it.next();
	        elementList = elementList + "" + element;
	    }
		} catch (NullPointerException E){
			elementList = E.toString();
		}
	return elementList.toString();
	}
  
}

so siehts nun aus und das ergebniss auf clientseite ist "null" ...

das heisst doch entweder das entweder ein falscher typ zurück gegeben wird oder das set leer ist oder?

mfg
 
Tipp: Bau dir einen Konstruktor, in dem du allen Attributen einen Wert zuweist. Das hilft schon mal.

Die Deklaration ist die Verknüpfung eines Variablennamens mit einem Typ (z. B. 'MeinObjekt o;'). Damit ist lediglich sichergestellt, dass der Compiler fehlerhafte Zuweisungen findet (Typsicherheit), aber es wird noch keine Instanz erzeugt.
Die Initialisierung sorgt dafür, dass eine Variable einen Anfangswert bekommt (also überhaupt erst mal eine Instanz erzeugt wird. Beispiel: 'o = new MeinObjekt();'.

Letzteres fehlt bei dir - du deklarierst zwar mySet, aber initialisierst es nirgends. Bei Attributen wie 'mySet' solltest du dir angewöhnen, diese entweder gleich bei der Deklaration zu initialisieren oder dies im Konstruktor zu erledigen.
 
Wenn aber ein Set von ner anderen Klasse o.ä. kommt dann ist es nicht unbedingt sinnvoll wenn das Set initialisiert wird.
Den Wert soll es ja von dem externen Programm erhalten.
 
Dann solltest du prüfen, ob du 'null' bekommst oder einen sinnvolleren Wert.

Also im obigen Beispiel nach Zeile 37 ein
Code:
if (mySet != null) {
einfügen und andernfalls eine Fehlermeldung ausgeben.
 
soo das problem ist anscheinend das die zeile :

Code:
Set<String> mySet =  (Set<String>) getSharedObjectNames(scope);

einen fehlöer verursacht ich habe nun mal alles nach und nach alles rausgenommen...

so sieht im moment aus:

Code:
package demo;
import org.red5.server.api.Red5;
import java.util.Iterator;
import java.util.Set;
import java.lang.String;
import org.red5.server.api.IScope;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.so.ISharedObject;

public class Application extends ApplicationAdapter {
	

public boolean roomStart(IScope room) {
    if (!super.roomStart(room))
        return false;
    
    createSharedObject(room, "sampleSO", true);
    ISharedObject so = getSharedObject(room, "sampleSO");
    
    return true;
   
}

  public String getSOList()
	{
		String elementList = "Elements: ";
		    IConnection conn = Red5.getConnectionLocal();
		    IClient client = conn.getClient();
		    IScope scope = conn.getScope();
		    
		    Set<String> mySet =  (Set<String>) getSharedObjectNames(scope);

		    return "test";


}
	}


wirft mir immer noch NULL raus

kommentiere ich doch diese Zeile hier aus
Code:
  Set<String> mySet =  (Set<String>) getSharedObjectNames(scope);

so das sie vom editor nicht berücksichtigt wird ist die ausgabe "test"...

wie geh ich jetzt weiter vor?
 
SamHotte hat gesagt.:
Dann solltest du prüfen, ob du 'null' bekommst oder einen sinnvolleren Wert.

Also im obigen Beispiel nach Zeile 37 ein
Code:
if (mySet != null) {
einfügen und andernfalls eine Fehlermeldung ausgeben.

hab ich eben vorher versucht und dann mal diesen generellen test gemacht, danke für den tipp.

mfg
 
würd ich ja auch weiter sagen,

problem ist nun:

ich weiss das mindestens ein SharedObject existiert und diese Zeile zumindest ein Set mit mindestens einem Sring zurück geben müsste.

frage ist warum verursacht diese Zeile einen fehler obwohl die synthax der aus der API entspricht und da fehlt mir leider jegliche idee was ich nun weiter tun könnte ausser wildes rumraten wie die richtige synthax ist.

mfg
 
SamHotte hat gesagt.:
Tja, ich kenne leider diesen komischen red5-server nicht ... was ist denn das für'n Gerät?

RTMP server, opensource in java programmiert, momentan noch alpha-beta stadium ist ein rtmp server der vergleichbar ist mit dem Adobe (former macromedia) Flash Media Server (former Flash Communication Server) ist.

kann im moment noch nicht alles und einiges was er kann ist buggy aber diese funktion da hat zumindest in version 0.4.1 funktioniert (weil ich hab einen forumsbeitrag im nicht supporteteten forum gelesen wo das einer gemacht hatte leider komplett ohne code), ich verwende version 0.5 (stable)

was er macht sind verbindungen zu flashclients erlauben und und kann diese auch hoste, im hintergrund läuft jetty und die config läuft über springframework und beans mit denen man handler für die custom applications erstellt.

man hat nun durch diverse funktionen die möglichkeit serverseitig eigene applicationen einzubauen in dem man die klasse

"ApplicationAdapter"

erweitert und die config entsprechend ändert(beans)um die handler zu setzen,

er kann das flash videoformat flv aktiv streamen, ermöglicht videoconferencing , video on demand in flashclients, kann diese shared objects verwalten und auch client remoting sowie server remoting (AMF) ist damit möglich.... hat aber im moment weder userverwaltung noch interne sprache noch datenbank oder irgendwelche anbindungen in der richtung,

aber den rest kann sonst nur der sauteure flash media server(dessen lizenzkosten pro steam / bandweite berechnet wird und mal locker 5000 euro kosten kann, pro jahr!)

infos mit ein wenig source:
http://www.joachim-bauch.de/tutorials/red5/MigrationGuide.txt

api:
http://dl.fancycode.com/red5/api/index.html?org/red5/server/api/IGlobalScope.html

hp:
http://www.osflash.org/red5

mfg
 
Naja, in so einem frühen Stadium kann das schon sein, dass der einfach mal das Format für seine Methodeninputs ändert und deshalb jetzt null zurückliefert - kannste denn den/die Entwickler kontaktieren? Vielleicht ist das ja sogar ein Bug ...
 
hmm dann werd ich es da weiter versuchen, ich hab da die letzten tage schonmal im forum (wo sich aber kaum einer blicken lässt) und der mailingliste gepostet und um hilfe bzw nur ein kleines anwendungsbeispiel gebeten, ich glaube ein paare der core developer machen gerad urlaub und die die man in der mailingliste liest haben anscheinend keine zeit.

kannst du nochmal kurz schauchen ob die synthax wenigstens so ok wäre dann frage ich da weiter nach hat ja sonst keinen sinn...

Code:
package demo;
import org.red5.server.api.Red5;
import java.util.Iterator;
import java.util.Set;
import java.lang.String;
import org.red5.server.api.IScope;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.so.ISharedObject;

public class Application extends ApplicationAdapter {
	

public boolean roomStart(IScope room) {
    if (!super.roomStart(room))
        return false;
    
    createSharedObject(room, "sampleSO", true);
    ISharedObject so = getSharedObject(room, "sampleSO");
    
    return true;
   
}

  public String getSOList()
	{
		String elementList = "Elements: ";
		    IConnection conn = Red5.getConnectionLocal();
		    IClient client = conn.getClient();
		    IScope scope = conn.getScope();
		    
		    Set<String> mySet =  (Set<String>) getSharedObjectNames(Iscope scope);

		    return "test";


   }
}


wäre wirklich nett dann nerv ich auch nicht weiter und löcher denen den bauch.

btw. euer forums-server stirbt gerade irgendwie langsam, der ist zeitweise nicht erreichbar und im moment hat ich nur grau ohne CSS formatierung und tippe auf gutglück 😀.

......

NACHTRAG euer forum WAR gerade Tot ich bin auf ner serverfehlerseite gelandet das die methode post nicht unterstüzt wurd auf index.html
 
Jepp, merke ich auch, bekomme grad die Grafiken nicht.

Schaut okay aus, deine Syntax. Ich würde evtl. einfach noch ein
Code:
System.out.println(mySet);
in Zeile 34 einfügen, dann weißt du wenigstens, ob es einen Rückgabewert gab - entweder schreibt er 'null' hin oder irgendwas anderes.
 
blöde frage, das mt dem system.out.println(mySet) hab ich schon versucht...

ich teste mit ANT über die commandline, weil ich den server für jeden test neu compilieren müsste sonst , eigentlich müsste die ausgabe dann dort stattfinden oder, ansonsten müsste ich mir endlich mal log4j anschauen unnd die apache common dateien mit ins project nehmen.?
 
soo einen schiesse ich noch nach ....


das erhalte ich wenn ich das mit dem casten mache:
INFO | jvm 1 | 2006/08/15 20:04:04 | Caused by: java.lang.ClassCastException: org.red5.server.Scope$PrefixFilteringStringIterator
INFO | jvm 1 | 2006/08/15 20:04:04 | at demo.Application.getSOList(Application.java:33)
INFO | jvm 1 | 2006/08/15 20:04:04 | ... 17 more


und dass wenn ichs ohne casten mache:
INFO | jvm 1 | 2006/08/15 20:09:55 | Caused by: java.lang.Error: Unresolved compilation problem:
INFO | jvm 1 | 2006/08/15 20:09:55 | Type mismatch: cannot convert from Iterator<String> to Set<String>
INFO | jvm 1 | 2006/08/15 20:09:55 |
INFO | jvm 1 | 2006/08/15 20:09:55 | at demo.Application.getSOList(Application.java:33)
INFO | jvm 1 | 2006/08/15 20:09:55 | ... 17 more



willste mal lachen 🙂
Code:
		    Iterator<String> mySet =  getSharedObjectNames(scope);
damit gehts

der Typ war schlicht und weck falsch.

ich brauchte Iterator<String> und nicht Set<String>


man man für den mist hab ich jetzt 3 tage gebraucht,

eine frage ist die API erklärung irreführend, falsch oder ich zu blöd das richtig zu deuten?? würde bei letzterem gerne wissen worauf ich achten muss damit mir das nicht wieder passiert ich hab mir an dem "Set<String>" und dem "Returns: set containing the shared object names" orientiert

getSharedObjectNames

public Set<String> getSharedObjectNames(IScope scope)

Description copied from interface: ISharedObjectService
Get a set of the shared object names.

Specified by:
getSharedObjectNames in interface ISharedObjectService

Parameters:
scope - the scope to return the shared object names from
Returns:
set containing the shared object names

danke nochmal und nach der frage lass ich euch auch in ruhe und bedanke mich recht herzlich für die hilfe bei allen beteiligten 🙂
[/u]
 
jo die api ist falsch... sollte heißen: returns: an iterator over the set containing shared object names oder ähnlich... der Rückgabewert ist halt nicht Set sondern Iterator - müsste man aber in eclipse auch sehen können, was da zurückgegeben wird von der Methode... hilfreich ists auch bei Buggy-Sources dieselbigen zu haben um dann mal gucken zu können... oder sollte das gar closed-source sein? 😉
 
hi und danke für deine antwort war sehr hilfreich, ich hab in eclipse gesehen das ein typ iterator zurückgeliefert wird als ich bei eclipse doppelt auf den fehlericon klickte und ich mal nicht casten sondern typ in iterator wechseln anklickte, sieht man das sonst noch woran?


zum open-closed source:
den ganzen source des servers kannst du dir runterladen die links zu den addressen wie homepage, api hab ich oben doch gepostet ist ein open source project von einigen java und flashentwicklern gestartet, sind leute aus der ganzen welt dabei.


falls du meine bescheidennen gehversuche mit java da oben meinst fühl dich frei jeden quelltext den ich irgendwo mal veröffentlicht habe zu benutzen, ich glaube zwar kaum das du das meintest oder es dir nützen würde bei java bei mir abzuschauen aber meinen segen hast du😀

greetz
 
Wenn's doch OpenSource ist, dann binde dir die Quellen in Eclipse ein und lass dir das Javadoc nochmal erzeugen, dann passiert sowas nicht.
 
SamHotte hat gesagt.:
dann binde dir die Quellen in Eclipse ein und lass dir das Javadoc nochmal erzeugen, dann passiert sowas nicht.
das erstere kann ich mir noch vorstellen (im moment binde ich nur die jar dateien ein die ich brauche, sind in dem fall nur 1 bzw 3 mit spring und log4j)

das zweitere kann ich mir nicht mehr vorstellen, wie erstellt man api documentationen mittels eclipse :shock:


mfg
 
Projekt -> Javadoc generieren ... (ist zwar ein bisschen Frickelei, bis du die richtigen Pfade hast, geht aber).

Du kannst natürlich auch einfach javadoc von der Kommandozeile aus benutzen 😉
 
okok ich seh schon der thread hier wird endlos lang... und geht weit vom thema ab... darum hör ich nun mal auf zu fragen und werde es mal mit eclipse versuchen und mal über "javadoc" :### nachlesen...

Riesigen dank nochmal an alle ihr wart wirklich eine hilfe, falls mal einer flashprobleme haben sollte......

mfg
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben