• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

OpenWIG java.lang.StringIndexOutOfBoundsException

kansu_makugen

Geocacher
Hi,

mein guter Freund Murphy hat mal wieder zugeschlagen. :motz:
Ich wollte heute einen letzten Test mit dem Update meiner Cartridge machen. Auf meinem HTC Desire HD rennt das Ding durch wie Sau. Finaler Input wird eingegeben, Cartridge auf complete gesetzt und Unlock Code als Item ins Inventory gemoved und fertig. Keine Probleme.
Auf meinem alten Nokia 5800XM schleicht sie eher - was ja zu erwarten war - aber läuft an sich fehlerfrei. Bis zum finalen Input. Ich gebe also die korrekte Antwort ein, es kommen die paar Messages, dass ich das ganz toll gemacht hab und dann...
Es blitzt ganz kurz eine Fehlermeldung auf - so kurz, dass man sie quasi gar nicht lesen kann - und ich lande wieder bei dem Item in der Final Zone, bei dem ich den Input starten kann. Kein Unlock Code im Inventory.
Ein Blick ins Log-File verrät mir folgendes:
10:2:2|0.0|0.0|100.0|1.0|:: java.lang.StringIndexOutOfBoundsException
Nun spreche ich keine Java, also ab ins Netz. Dort finde ich folgendes zu dieser Fehlermeldung:
Es wurde versucht auf ein einzelnes Zeichen eines Strings zu zugreifen. Das ist natürlich möglich, jedoch darf dabei der Zugriffsindex nicht außerhalb des zulässigen Bereichs liegen. Das erste Zeichen eines Strings hat den Index 0, das letzte Zeichen hat den Index n-1, wenn n die Länge des Strings ist. Dazwischen ist der Zugriff erlaubt. Hat der String die Länge 0, so ist demnach auch kein Index zulässig.
An der entprechenden Stelle des Log-Files vom Android Phone wird die Description des Unlock Code Items geändert, etwa in der Form
Code:
objUnlockCode.description="Der Unlock Code lautet "..string.sub(Player.CompletionCode, 1, 15).."."

Jetzt vermute ich :hellsehen: , da es ja eine testkompilierte Catridge ist, dass der Unlock Code leer ist und deshalb diese Exception kommt. Das Komische ist wie gesagt, dass WhereYouGo, was ja auf OpenWIG basiert, keinen Fehler bringt. Dort steht in der Item Description "Der Unlock Code lautet none."

Bevor ich jetzt anfange und zerpflücke meine gesamte Cartridge auf der Suche nach dem Fehler; kennt ihr dieses Phänomen? Liegt es nur an einem leeren String?
 

HowC

Geomaster
das ist jetzt relativ einfach (wenn man programmieren kann)

Du greifst auf einen Text zu... startend mit dem 2. Zeichen (eh schon wissen.... 0 ist das erste) und dann 15 Zeichen lang... wenn dein Player.CompletionCode jetzt keine 15/16 zeichen lang ist, dann geht das in den gatsch
string.sub(Player.CompletionCode, 1, 15)

möglicherweise wollte jemand das erste Zeichen wegschneiden. hab mich mit dem completioncode auch noch nicht beschäftigt (weil man ihn ja gar nicht wirklich braucht)

das wird schon gehen
objUnlockCode.description="Der Unlock Code lautet "..Player.CompletionCode, .."."

oder so, wenns da irgendwo ein Length gibt.... oder sizeof.... mann mann mann... java ist lange her
objUnlockCode.description="Der Unlock Code lautet "..string.sub(Player.CompletionCode, 1, Player.CompletionCode.Length-2).."."

(oder -1?? mal kaffeetrinken und nachdenken)
 
OP
kansu_makugen

kansu_makugen

Geocacher
Bei LUA hat das erste Zeichen eines Strings (genauso wie das erste Element eines tables) den Index 1, nicht 0. Intern wird das ganze dann wohl umgewurschtelt, damit der (javabasierte) Player damit umgehen kann. Es soll mit "string.sub(Player.CompletionCode,1,15)" das letzte Zeichen, also das 16. weggeschnitten werden. Der Compiler auf Wherigo.com erzeugt wohl eine 16stellige Zeichenfolge. Beim Unlocken einer Cartridge werden aber nur 15 akzeptiert. Der oben stehende Code wird von Urwigo automatisch eingefügt. Was mich eben wundert ist, dass es im WhereYouGo Player funktioniert. :???:

HowC schrieb:
...oder so, wenns da irgendwo ein Length gibt.... oder sizeof.... mann mann mann... java ist lange her
objUnlockCode.description="Der Unlock Code lautet "..string.sub(Player.CompletionCode, 1, Player.CompletionCode.Length-2).."."...

Das wird aber, denk ich, nicht funktionieren, wenn der string die Länge 0 hat.

Mich würde halt nur mal interessieren, ob jemand beim Testen schon mal über dieses Problem gestolpert ist. Ich kann mich nämlich nicht daran erinnern, dass das bei den früheren Versionen der Fall war. Ist natürlich möglich, dass ich damals einfach nicht bis zum Ende gespielt hab. ;)
 

bodenseepingu

Geomaster
Ist der Fehler denn reproduzierbar? Nach meinen Erfahrungen sind die String-Befehle dann kritisch, wenn eine verwendete Variable NIL ist - nicht aber, wenn kürzere Strings oder ein Null-String drinsteht - das wird schon korrekt gehandhabt.

Falls der Fehler reproduzierbar ist, solltest einfach mal eine Testcartridge machen, die nur diesen Anteil enthält - der müsste auf dem entsprechenden Gerät ja dann den Fehler produzieren.

Ich hab allerdings auch schon öfters mal erfolglos versucht, einer Fehlertheorie nachzurennen - ist manchmal schon schwierig herauszufinden, welche Konstrukte denn reproduzierbar zu nem Fehler führen und wenn dann nur auf bestimmten Geräten - da spielt dann die verwendete Java-Version auf dem Gerät vielleicht auch noch ne Rolle.

Übrigens auch für Testcartriges, die von Urwigo compiliert wurden gibts einen generierten Unlock-Code - den kann man auch einstellen - man kann jetzt testweise auch noch die Online-Compilierung verwenden - aber ich sehe jetzt keinen Fehler, den Du begangen hättest - wo denn auch - alternativ kann man halt mal über LUA mal den Unlock-Code verarbeiten
 

HowC

Geomaster
der erste buchstabe ist 1? :???:
ja wahnsinn... wie soll man sich denn da auskennen? :???:
:D

aber warum nun dieses gekürze?
objUnlockCode.description="Der Unlock Code lautet "..Player.CompletionCode, .."."
Wenn nicht gerade PLAYER = NULL / NIL oder so ist, dann müßt das gehen. Im blödesten Fall steht dann halt: Der Unlock Code lautet NIL.

Wenn Player NULL ist, dann wird wohl mehr nicht gehen.... :???:

Und das kann man ja auch abfragen vorher
nachdem mir persönlich das abschreiben und eintüpfeln des codes immer zu doof vorgekommen ist, hab ich (wenn überhaupt) immer die completede cartridge hochgeladen.
 
OP
kansu_makugen

kansu_makugen

Geocacher
@bodenseepingu:
Ich hab die Online Kompilierung verwendet, weiß aber nicht, welchen Wert dabei der Completion Code bekommt. Auf dem HTC (Android) ist die Description des Unlock Code Items "Der Unlock Code lautet none". OpenWIG crasht wie gesagt.
Mein Rechner ist grad außer Reichweite, deshalb kann ich keine Cartridge zusammenbasteln, die nur den "fehlerhaften" Code enthält. Bei der Cartridge, die ich grad auf dem Telefon hab, kommt die besagte Fehlermeldung aber immer. Und auch immer an derselben Stelle. Aber eben nur bei OpenWIG. Also wird es wohl so sein, dass der CompletionCode NIL ist und nur die WhereYouGo App daraus ein "none" macht. Werde heute Abend noch mal rumprobieren. Hätte ja nur sein können, dass das ein bekanntes Problem ist und man sich in der fertigen Cartridge (die man von wherigo.com runterlädt) darum keinen Kopp machen muss.

@HowC:
Warum der Code gekürzt wird, hatte ich ja schon geschrieben. Die wherigo.com Website generiert bei der Kompilierung einen 16stelligen Code, verarbeitet bei Eingabe, also beim Unlocken einer Cartridge, aber nur einen 15stelligen. Ist eben nur eine Betaversion. Urwigo nimmt halt automatisch eine "Längenkorrektur" vor.
Zu der Sache mit dem Upload der completed Cartridge: Da muss man doch nicht das GWC-File, sonders das GWS-File, also quasi das Savegame hochladen. OpenWIG und WhereYouGo erzeugen aber ein OWS-File und ich hab noch nicht ausprobiert, ob das damit auch geht.

Naja...

Ich danke euch erstmal für die Antworten. Ich werde heute mal ein bisschen rumprobieren. Wenn mir die Erleuchtung kommt, lasse ich euch teilhaben. :)

Gruß
 

bodenseepingu

Geomaster
Schau mal die Einstellungen im Urwigo an - dort kann man den Unlock-Code vorgeben - trage
da mal irgendwas 15 oder 16 stelliges ein, das muss dann auch in der Cartridge angezeigt werden.

Unter Datei-Einstellungen, Reiter Kompilieren findest den.
 

HowC

Geomaster
im endeffekt brauchst zum LOggen auf gc.com gar nix, und auf wherigo.com brauchst eigentlich auch nix. Dort kannst zumindest was eingeben/hochladen, aber alles auf freiwilliger basis.
 
OP
kansu_makugen

kansu_makugen

Geocacher
So, ich hatte ein bisschen Zeit zum rumprobieren...
Die Fehlermeldung ist auf einen leeren Completion Code zurückzuführen. Komischer weise kommt das Nokia 5800 bzw, OPenWIG damit nicht zurecht, WhereYouGo dagegen schon. Auch der Emu vom GS Builder läuft durch und sagt mir "Der Unlock Code lautet none".
Ich hatte den schuldigen Code entfernt und plötzlich gings (wenn man mal davon absieht, dass es an anderer Stelle gecrasht hat, aber mit demselben Fehler - Das Item "Unlock Code" hat einen Befehl "Anzeigen", der eine Message zeigt à la "Der Unlock Code lautet..." :p )

@bodenseepingu:
Ich hatte in den Urwigo Settings einen Code händisch eingetragen, allerdings wird der nicht übernommen, wenn man das GWZ-File direkt auf wherigo.com kompiliert. Die Online Kompilierung von Urwigo kann ich nciht nutzen. Kommt jedesmal 'ne Fehlermelung. Ich denk mal, der Upload dauert zu lang.


OK, frohen Mutes hab ich also das Update auf wherigo.com hochgeladen - ich hatte ja alles ausgiebig getestet - und wollte schnell noch schaun, ob denn der Download auch geht und...
:explode:
Error During Upload

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> Exception of type 'System.ApplicationException' was thrown. at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) at Wherigo.GSPCartridgeService.CartridgeService.GetCompiledCartridgeWithMetaData(GWZMetaData gwzMetaData, String CartridgeFileName, String CartridgeId, Int64 PlayerId, String PlayerName, DeviceType deviceType, String CompletionCode) at cartridge_download.btnDownload_Click(Object sender, EventArgs e)

What the..!? Ein Fehler beim Upload, wenn ich die Cartridge downloaden will!?

So, ich hab erstmal die Schnauze voll für heute. Werd mich morgen damit befassen.
Scheißladen...
 
OP
kansu_makugen

kansu_makugen

Geocacher
Moin,

meine Fehlersuche war erfolgreich. Trotzdem bin ich verwirrt.
Der Download der Cartridge hat wegen des simplen Codeschnipsels "string.byte(stringvar,i)" nicht funktioniert. Wie schon gesagt: wenn ich das GWZ-File direkt auf wherigo.com compile, funktioniert es. nur nach dem Upload der GWZ in das eigentliche Cartridge-Listing geht der Download nicht mehr.

Das Kuriose an der Sache: Wenn ich statt "string.byte(stringvar,i)" einfach "stringvar:byte(i)" verwende, geht es. :???: Da soll erstmal einer drauf kommen. :/

Wollte das nur mal loswerden. Schönen Leap Day noch! :)
 
OP
kansu_makugen

kansu_makugen

Geocacher
bodenseepingu schrieb:
Seltsam - @Kansu: trägst du im Wherigo-Handbuch was dazu ein?

Eher nicht. Kann das Problem nicht nachvollziehen. Zumindest nicht außerhalb meines WIGs. Ich hab mal eine kleine Testcartridge zusammengestellt. Nur ein Item mit Aufruf der besagten Funktion. Die GWZ wurde in ein Testlisting auf wherigo.com hochgeladen und seltsamerweise ließ sich die Cartridge ohne Probleme runterladen. :???:
D.h. das Problem beschränkt sich nur auf diese (m)eine Cartridge. Der Hammer ist ja auch, dass es nicht mal geholfen hat, wenn ich den gesammten Usercode auskommentiert hab. Ich versuche aber gar nicht weiter, das zu verstehen. Kann vielleicht sein, dass da irgendein verrücktes Zeichen in den Usercode reingerutscht ist, auf das der Compiler allergisch reagiert. Keine Ahnung.
In der Testcartridge funktioniert also sowohl s:byte(i) als auch string.byte(s,i)
 
Oben