Wer bietet mehr: Aufgabe 8.2


Also ich habe ohne Threads 9 (7 Exceptions, 2 Errors). Die schwierige von knotenpunkt habe ich aber nicht.


[werbung]
http://wwwcip/~ar79yxiw/downloads/killfile_fsi_forum.user.js
[/werbung]

1 Like

@izibi: kennen wir uns?

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)


@ knotenpunkt: Hast du die run()-Methode umgeschrieben?

@ DerBaer: das mit den 27 OutOfMemory-Errors stimmt wirklich. Hab jetzt schon 3 mit trivialen Mitteln.


Da wir schon bei völlig bescheuerten Sachen sind, hätte ich da übrigens noch was für knotenpunkt:

java.lang.StackOverflowError
	at CashRegister.<init>(CashRegister.java:11)
	[...]

@Der Bear

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.


  1. /quote ↩︎


Hier mal eine:

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.

5 Likes

Äh ict, was heißt das jetzt genau?

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^^


8 Likes

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.

4 Likes

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.

1 Like

10/10 would read again

1 Like

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’ :slight_smile:

2 Likes

Das muss jeder für sich selbst entscheiden

Was ist das? Was ist soziale Kompetenz?

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

1 Like

den Kindergarten-AuD-Kurs gibts, der heisst AuD-MT. :slight_smile:

1 Like

Die Knotenpunktsche Erklärung von Multi-Threading

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
		}

anschließend trägt er des zeugs in die arrays ein

products[savedProducts] = prod;
prices[savedProducts] = Integer.parseInt(price);

und dann zählt er 3tens noch den Counter hoch

savedProducts++;

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!^^

lg knotenpunnkt