Die zwei unechten sind ja anscheinen nur einer gemeinsam deswegen… les dazu den ganzen thread durch… dann wird der schwund aus dem kontext klar
Threads entdecken?
Also für mich sind Threads fester Bestandteil von Java und nicht so nebensächlich, dass man sie erst mal „finden“ müsste
Und die in deiner Sicht erst zu findenden Threads sind der Grund dafür, warum ich überhaupt noch etwas Aufmerksamkeit der Sprache Java schenke
Editiert: Ach übrigens Izibi: Jetzt kann ict gar nicht mehr seine AUD-Teamlichkeit beweisen (Du hast ihm zu sehr geholfen)
Chayyam wenn du dich in Threads auskennst, dann kannstese ja mal versuchen^^
Falls ich irgendjemand wichtigen vergessen habe, der noch von mir zitiert werden möchte, dann soll er sich nochmal melden…
Eventuell lege ich morgen auch so nochmal nach
Kommt drauf an ob ich nicht
Als Java-Profi findest du sicherlich auch noch die 27 anderen Stellen, an denen du OutOfMemoryError’s produzieren kannst (Hint: Es geht mit trivialen Java Funktionalitäten, ohne eine einzige weitere Klasse zu benutzten)
Kommt drauf an, was du als Klasse definierst und die 27 will ich sehen (also auch mit der Aufgabenstellung übereinstimmend)
Wieso völlig bescheuerte Sachen?
Wir sind langsam mal dabei, dass AUD mal etwas interessanter wird
Wenn du mir mal kurz vorher die Spielregeln nennst… dann versuch ichs mal
Reflections, Bytecodemanipulation verwendet?
JVM-Parameter angepasst
Weitere Klassen verwendet, die von Cashregister erben
Würde EST diese Lösung akzeptieren?
Hast du entsprechenden Java-Code geschrieben der diese Exception auslöst,
oder hast du ihn dir nur formal gedacht
Diese Spielregeln sind wichtig, weil sonst zauber ich dir jede Exception
Achja was mich auch noch interessiert, warum hast du nicht den kompletten Stack-Trace hier reinkopiert
Hätte es die max Testlänge von nem Beitrag hier gesprengt?^^
@bear
Wieso Java-Profi? (hab ich niemals gesagt)
Also ich selber finde Java sch****
vor allem deswegen weil es im normalen Gebrauch sehr restriktiv und strong typed ist
Weil die hier genannten Errors irgendwie nichts wirklich mit Fehlern im Programm zu tun haben. Irgendwann geht offensichtlich der Speicher aus.
Viel Spaß, sind ganze 2 Zeilen Code und hat genau nichts damit zu tun, dass der vorgegebene Code kaputt ist.
Nein.
Nein.
Nein.
Weiß ich nicht, wüsste aber nicht, warum es nicht sollte.
[quote=knotenpunkt]Hast du entsprechenden Java-Code geschrieben der diese Exception auslöst,
oder hast du ihn dir nur formal gedacht[/quote]
Ja, habe ich.
Das ist schön.
[quote=knotenpunkt]Achja was mich auch noch interessiert, warum hast du nicht den kompletten Stack-Trace hier reinkopiert
Hätte es die max Testlänge von nem Beitrag hier gesprengt?^[1]
Er ist ziemlich lang. Wie das bei nem StackOverflowError nun mal so ist.
java.lang.OutOfMemoryError: Java heap space
[...]
at CashRegister.register(CashRegister.java:22)
[...]
Ich leg ein CashRegister Objekt an und ruf darauf register() auf mit 2 Strings. Fertig.
Widerspricht kein bischen der Aufgabenstellung und braucht auch keine tollen Features. Kann also mit den aktuellen Java-Kenntnissen der Vorlesung gelöst werden.
Allen eventuell noch mitlesenden nicht-knotenpunkten möchte ich noch mal die Aufgabenstellung paraphrasieren:
Es geht um Ausnahmen, die durch falsche Benutzung entstehen und die das Programm durch ordentliche Fehlerabfrage vor ihrem Auftreten oder durch [m]try-catch[/m] an fest bestimmbaren Punkten erkennen kann.
Vor Aufruf von Methoden den Speicher selbst aufzubrauchen (sei es Stack oder Heap) ist keine falsche Benutzung der Klasse und der dann fliegende Error kann auch nicht vorhergesehen werden. Da wir in AuD immer von einem sequenziellen Programm ausgehen sind auch Nebenläufigkeitsprobleme nicht teil der Aufgabe.
Sind die errors damit jetzt grundsätzlich augeschlossen?
Gibts dann nur noch 7 Exceptions?
Zur Erinnerung:
Und warum kannst du das nicht voher schon aufs Aufgabenblatt schreiben, dass man bspw. Nebenläufigkeitsprobleme nicht anwenden darf
Also ich hab jetzt eigentlich keine Lust mehr, des wieder aus dem Code zu entfernen
Also ich dachte immer dass diese Übungsblätter aus AUD zum üben da sind
Aber so wie es aussieht wird man dadurch eher im Lotteriespielen trainiert
(„Probiere einen mit der Aufgabenstellung übereinstimmenden Lösungsweg“ und hoffe dass du ihn richtig gewählt (getippt) hast… sonst gewinnst du nichts (gilt auch insbesondere für 8.3))
Achja zu:
Da Aud eh schon schwach angefangen und stark nachgelassen hat…
Durch diesen Ausschluss…
Herzlich Willkommen im…
PS: ict ich warte immer noch auf deine Lösung zu meiner schönen 9ten … X-ten Exception kA wieviel ich mittlerweile hab^^
Naja wenn du möchtest erklär ichs dir auch nochmal wie des genau funktioniert
Kommt drauf an… kannst du mit verschiedene Ansätze lösen
Aber ich würde jetzt mal pauschal sagen: ja^^
Wie schon die ganze Zeit: Als Entgegenkommen für kreative Fehlersuche zählt ein bestimmter, leicht auszulösender Error. Wenn man den nicht hat, gibts trotzdem volle Punkte.
… ersten Semester. Geh doch mal in den CIP wenn Rechnerübung ist und sag den Leuten ins Gesicht, dass die ganze harte Arbeit, die Programmieranfänger ins Programmieren lernen investieren, Kindergarten ist und es noch viel schneller gehen sollte.
Wieso denkst du eigentlich, ich müsste dir irgendwas beweisen? Du möchtest hier den Schein.
Habe da noch ne ganz interessante Exception gefunden:
java.lang.NullPointerException
at CashRegister.average(CashRegister.java:42)
at CashRegisterTest.triggerKnotenpunkt(CashRegisterTest.java:36)
at CashRegisterTest.triggerException1(CashRegisterTest.java:11)
at CashRegisterTest.main(CashRegisterTest.java:87)
Caused by: KnotenpunktException
at CashRegister.trollingKnotenpunkt(CashRegister.java:0)
... 1 more
Knotenpunkt-verbotene-Dinge-Checkliste analog zu diesem Post.
bin ja der festen ueberzeugung, dass dieser “knotenpunkt” uns alle nur verarschen will, weil:
ich behaupte, menschen mit so wenig sozialer kompetenz kann es (bitte) nicht geben
troll-indiz: namen-legasthenie
26 beitraege, davon alle im aud-teil des forums
→ entweder expliziter troll-acct, oder ein(/mehrere) kumpel(s) v. ict, der(/die) hier in kaufman-manier eine “ganz grosze nummer” fuer sich selbst inszeniert(/inszenieren).
falls keines von beiden:
glueckwunsch knotenpunkt - wirst wahrs. ein weiterer ueberheblicher, unfaehiger, […], selbtdarstellender stern am himmel der informatik.
auf den schluss sind wahrs. schon einige gekommen - ich wollt’s einfach mal resuemieren und damit ankuendigen, dass ich jetzt wieder wahrs. regelmaeszig aud-posts lesen werde, weil ich eben auf anti-humor steh’
Es wäre echt cool, wenn es einen Namens-Compiler/Interpreter geben würde… der mir fehlerhafte Namen anzeigen würde
stimmt
wer weiß das schon
Ein stern zu sein ist doch schön^^
Wie wir ja in AUD lernen oder meiner Meinung nach gelernt haben sollten ist, dass man auf eine Schnittstelle und nicht auf eine Implementierung programmieren sollte (siehe Thread: Aufgabe 6.4 von mir)
Also ist es unrelevant wie die Implementierung aussieht (ueberheblicher, unfaehiger,)
Wenn dabei ein Stern herauskommt, ist doch alles gut^^
Da werden sich die Foren-Inhaber aber sehr freuen, dass du wieder öfters hier vorbeischaust.
Sie zahlen ja schließlich auch ne große Stange Geld an mich
Hast du mich nicht gesehen, wo ich das in nem CIP während einer Rechnerübung den Leuten des ins Gesicht gesagt habe?
Naja eigentlich stimmt das nicht ganz… Ich habs ihnen ins Ohr gesagt - zumindest so ähnlich
Und rate mal, was passiert ist?
Sie haben mir zugestimmt
Aber nur deswegen, weil ich Ihnen noch etwas ins Ohr gesagt habe…
Ich habe Ihnen letztendlich folgendes gesagt:
Der Stoff ist an für sich ganz chillig
Bloß die Aufgabenstellungen sind oft nicht gut und das kostet echt nerven und macht den Eindruck, dass alles richtig schwer ist
und statt Programmieraufgaben zu lösen, lernt man hier eher das Verstehen von unvollständigen und missverständlichen Aufgaben (also eher was für die philosphische Fakultät)
(das war diesesmal echt human augedrückt - um nicht ganz so gemein zu sein -, wer den Spaß trotzdem haben will… der soll sich des einfach im Knotenpunkt-Stil denken)
Also um auch mal etwas positives zu sagen:
Die Aufgaben an für sich sind teilweise echt gut, wenn nicht sogar top
Bloß halt die Bitte die Aufgaben mit etwas besseren „Aufgabenstellungen“ darzustellen
und wenn ihr mal etwas definiert, dann nicht solch komische Sachen wie überall Setter/Getter
Also die Aufgabe 8.2 war im Gegensatz zu 8.3 echt gut gestellt, auch wenn die Aufgabe 8.2 trotzdem noch Schwachpunkte besitzt
Ihr hättet ja auch gleich reinschreiben können, dass Nebenläufigkeitsprobleme bei dieser Aufgabe nicht zu beachten sind
Nochmal allgemein zum Thema Kindergarten:
Wie siehts aus, wenn ihr zwei Informatik-Kurse anbieten könntet
Einen für diejeningen, die komplett von vorne Anfangen
Und einen für schon „fortgeschrittene“
Also am Geld kanns ja net scheitern…
… Ihr habt ja schließlich auch genug davon, mich hier fürs Forum zu bezahlen
Such doch bitte nicht einfach immer billige Ausreden, ict
Es ist doch wohl klar, dass du nicht genau weißt, wie man diese Exception zustande bekommt
und deswegen erklär ich dir das im folgenden Text mal etwas ausführlicher
Für alle anderen, die auch etwas dazu lernen möchten- lest den folgenden Text
Übringens nach diesem Text werde ich so 1-3 wochen Foren-urlaub machen
Die Knotenpunktsche Erklärung von Multi-Threading*******
Wenn du den Text gelesen hast dann wirst du verstehen wie man folgende Exception auslösen kann:
======
Running triggerException9(): Exception triggered:
java.lang.NullPointerException
at CashRegister.average(CashRegister.java:42) //das ist die Zeile mit sum += prices[i];
at CashRegisterTest.triggerException9(CashRegisterTest.java:XXXXX)
at CashRegisterTest.main(CashRegisterTest.java:YYYYYY)
======
Um die Exeption besser zu verstehen zu können, fange ich erst mal bei den Grundlagen an
Wir brauchen Threads
Ich beginne erst mal mit zwei Threads
Thread1 ist ICT
Thread2 ist izibi
Man kann sich threads so vorstellen… ich habe zwei prozessorkerne und beide arbeiten zur gleichen Zeit irgenwelches Zeugs ab
ict und izibi können auch zur gleichen Zeit etwas machen (ob das für diese beiden zutrifft ist eine andere Frage)
Da wir uns ja im Kindergarten-Aud befinden lassen wir ict und izibi mal im Kindergarten spielen
Kurze Anmerkung, wenn ich von wir oder so rede dann meine ich den Clienten also derjenige der vorgibt wie das Programm abzulaufen hat
Izibi und ict bauen an verschiedenen Sand-Locations Sandburgen also sie arbeiten an irgenwelchen Datensätzen bspw. an irgenwelchen Objekten
also jede Sandgrube stellt ein Java-objekt dar bzw. ein Datensatz
Sie können beide zur gleichen Zeit an ihren jeweiligen Datensätzen (äh Sandgruben) spielen
Lernfortschritt: Zwei Threads können an zwei Datensätzen arbeiten → No problems!
So jetzt wird izibi aber sauer, weil seine Sandgrube kleiner ist wie die des icts
Die Kindergärtnerin beschließt daraufhin, dass izibi an der gleichen Sandgrube wie die des icts spielen darf
Also arbeiten nun izibi und ict am gleichen Datensatz
Dass dies schief gehen muss ist auch schon alleine durch die Tatsache vorherbestimmt: Ict, Izibi (kein weiterer kommentar)
Da wir uns in einem Begabten-Kindergarten befinden, können ict und Izibi schon super bis 10 zählen und sich zahlen super auswending merken
ict und izibi sollen nun an dieser Sandgrube zwei Türme und eine Brücke, die die zwei Türme verbindet bauen
Izibi ist für die Türme zuständig und ict für die Brücke
Izibi baut die Türme und Ict die Brücke - unabhängig voneinander (wie man eine Sandbrücke bauen kann unabhängig von den Türmen ist jedem seiner eigenen Phantasie überlassen)
Jetzt kommt der Punkt, wo man beides zusamen setzen soll
Izibi hat den Auftrag, die Türme solange weiter zu vergrößern (in der höhe) bis Ict die Brücke drauf gesetzt hat
Ict schaut sich die Türme an, merkt sich die Höhe…
Izibi baut die Türme weiter in die höhe
Ict ist faul und verlässt sich auf die zuvor gemerkte Höhe und versucht die Brücke auf die Brücke auf die Türme zu setzen
Da die Türme aber mittlerweile weiter gewachsen sind, reißt Ict das ganze Vorhaben damit ein…
=> Vorhaben gescheitert ->Programm kaputt
Ok zugegegebenmaßen ist das oben nicht wirklich ein gutes Einführungsbeispiel (mir ist jetzt eben zum Thema Kindergarten nix besseres eingefalllen)
Aber es geht ja noch weiter!!^^
Ict und Izibi altern! (für die, die es nicht verstehen: sie werden älter)
Außerdem gewinnen Sie Freunde (weitere Threads), da sie vermeintlich zahlreiche Foren-Schlachten gegen Knotenpunkt gewinnen
Es sind aber weiterhin nur zwei Prozessorkerne vorhanden, was machen wir dann mit den weiteren Freunden/Threads
Gehen wir mal davon aus, dass ein Prozessorkern einen Raum darstellt mit einer gewissen menge an sauerstoff, welcher durch pflanzlichliches zutun nachgebildet wird
Dass aber niemand in diesem Raum stirbt, darf nur eine Person/ein thread im Wachzustand sein alle anderen haben zu schlafen
ein willkürliches höhere Wesen bestimmt nun welche person wach zu sein hat, wann diese wieder einzuschlafen hat und wann eine willkürliche andere Person aufzuwachen hat
Dieses willkürliche höhere Wesen wird unter Kennern auch des öfteren mal als thread scheduler bezeichnet
So ist vlt. auch obiges Beispiel besser erklärt
ict merkt sich die höhe der sandtürme
hat dann wegen dem höheren wesen einzuschlafen
dann kommt bspw. izibi dran, dieser darf die türme weiterbauen
dann hat dieser wieder einzuschlafen
dann wacht ict wieder auf und setzt die brücke an die zuvor gemerkte höhe
->Crash
Aber wie gesagt Ict und Izibi wurden älter und haben thread-freunde gefunden
Sie haben sich alle bei so ner Kassenzettel-Firma beworben und wurden allesamt genommen
Sie wurden schließlich für die register-Methode im Kassenzettel angestellt
Ict soll nun mehrere „Posten“ registrieren
dabei kontrolliert er erst mal die prod länge
if (prod.length() > MAX_PRODUCT_LENGTH) {
return; //Silently ignore this
}
Das macht er meinetwegen 5mal, danach sagt der thread scheuduler dass er einzupennen hat
Jetzt ist izibi dran und soll auch mehrere posten registrieren
Izibi ist etwas cooler drauf wie ict
und schafft deswegen 7 einträge, bevor er einzupennen hat
(also wie gesagt: Willkürlich)
JETZT kann aber auch folgendes passieren
ict ist mal wieder dran
er kontrolliert die länge ->passt
er trägt zwei posten ein
savedProducts ist bspw. 5
products[savedProducts] = prod; //wird an 5 eingetragen
prices[savedProducts] = Integer.parseInt(price); //wird an 5 eingetragen
so und wie bereits mehrmals erwähnt… der thread-scheduler ist willkürlich und lässt ict jetzt einpennen (also bevor er überhaupt seine methode vollens zu ende hat ausführen können)
jetzt ist izibi dran
er fügt auch die daten hinein
da aber savedProdukts weiterhin 5 ist passiert folgendes:
products[savedProducts] = prod; //wird AUCH an 5 eingetragen-> also die alte 5 wird überschrieben
prices[savedProducts] = Integer.parseInt(price); //wird AUICH an 5 eingetragen-> also die alte 5 wird überschrieben
Durch den Überschrieb tritt aber noch kein Fehler auf
Übringes der Thread-Scheduler lässt izibi (weil er wie gesagt der coolere ist) zuende machen
also noch
savedProducts++;
und dann darf wieder ict dran
dieser macht genau da weiter wo er aufgehört hat also macht er auch noch
savedProducts++;
=> savedProducts ist nun 7
=> Weitere Produkte werden an der Stelle 7 im Array eingefügt
=> Stelle 6 ist weiterhin NULL
wird jetzt average() aufgerufen…
dann knallts an i=6 in der for-schleife
also bei sum += prices[i];
also =>
======
Running triggerException9(): Exception triggered:
java.lang.NullPointerException
at CashRegister.average(CashRegister.java:42) //das ist die Zeile mit sum += prices[i];
at CashRegisterTest.triggerException9(CashRegisterTest.java:XXXXX)
at CashRegisterTest.main(CashRegisterTest.java:YYYYYY)
======
Rein theoretisch ist dieser Fehler schon machbar, wenn nur izibi und ict als threads arbeiten
Aber man erhöht die Wahrscheinlichkeit wenn ihre Threads-Freunde auch noch mitarbeiten dürfen
(thread-sheduler wird öfters wechseln)
Der Fehler ist auch möglich wenn man das mit 2 prozessorkerne gemacht wird, weil auch die lesen jeweils die Daten aus uns „speichern diese zwischen“
So aber in der b) heißt es, dass man den Fehler ausmerzen soll
Dafür hat Java eine Geheimwaffe
und diese Geheimwaffe ist der JohnDoe
Warum JohnDoe?
Naja er ist gut darin Java-Code formal zu beweisen
Ich wollte an der Stelle mal anmerken, dass deine Vorlesung echt gut war
Ich bin zwar dabei eingeschlafen…
… aber das lag nicht an dir, sondern an mir!
Aber es ist immer noch nicht geklärt, warum JohnDoe die Geheimwaffe von Java ist
Leute, die in Java Dinge formal beweisen, haben noch ausreichend Zeit für Nebentätigkeiten… wie z.b Türsteher-Jobs oder so was ähnliches
Man kann sich als bspw. für ne Methode (für die register-Methode) einen JohnDoe bestellen -als Türsteher
Aber vorsicht! So gut augebildete Leute wie der JohnDoe sind teuer!
Hier schon mal der kleine tipp: man sollte türsteher nur dann bestellen, wenn man sie wirklich unbedingt braucht (bei register-methode braucht man sie!)
so ict fängt wieder an
er frägt zuerst johDoe ob er in die registermethode eintreten darf
der sagt: No problem
und ict geht rein
er arbeitet wieder einen teil der methode ab (nur einen teil!)
hat dann wieder einzuschlafen
izibi ist dran:
izibi will auch in register eintreten:
johnDoe sagt: Ne dich lass ich hier nicht rein… is schon jemand drinnen
izibi wird erst dann eintreten können wenn ict wieder ausgetreten ist
Teuer ist das ganze deswegen weil es dem thread-scheduler wuschd ist ob ein thread „weiter“ machen kann oder nicht
also es werden viele threads/ viele ict/izibi freunde fragen ob sie eintreten dürfen und ein nein erhalten → vergeutete ressourcen
->teuer
Übrigens hier noch die Anmerkung: johndoe wird immer komplett für ein object zuständig sein
also alle methoden eines objekts, die einen türsteher verlangen, haben den gleichen türvorsteher
und in den ganzen pool, abgesicherter methoden kann man nur über diesen einen türvorsteher eintreten und der lässt in den pool auch nur einen einzigen rein
mit tricks kann man das etwas abändern, aber das wird dann wieder teurer
so das wars:
wenn ihr wollt poste ich noch vor meiner pause, den ausgeschmückten java-code mit izibi und ict
Außerdem:
wenn ihr wissen möchtet, warum ict und izibi zu Philosophen werden, die nur mit einer Hand essen, wenn man JohnDoes an der falschen Stelle einsetzt
oder wie man einen JohnDoe austricksen kann, ohne den Einsatz von Bytecodemanipulation oder Reflections, aber mit den Objektmethoden wie wait() und notify() bzw. notifyAll()
und warum man das für Taxis sehr gut einsetzen kann…
dann … (überlegts euch selber)
Ansonsten verabschiede ich mich jetzt in die Weihnachtsferien
und beantworte/zerlege nur noch das nötigste
und ich hoffe dass das bonusblatt taugt, dass ich meinen Weihnachtsurlaub nicht auch noch zunichte machen muss
ansonsten gilt weiterhin folgender Grundsatz: Nehmt meine Aussagen so hin wie sie sind… sie sind einfach richtig!^^