Bonusblatt

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Bonusblatt

Beispiel:

4
+
--> "Fehlerausgabe"
=

Soll in diesem Fall 4 ausgegeben werden oder auch wieder die Fehlerausgabe greifen? „Der Keller soll in diesem Fall leer bleiben.“ Ich versteh das so, dass sobald dieser Fehler greift, der Keller nachher auch leer sein soll. Also soll „der Fehler“ dann folglich ein einzelnes Element im Stack (zu unrecht wie ich finde) entfernen… Oder nicht?


Wenn das + kommt, holst du die erste 4 aus dem Stack, versuchst dann den zweiten Operanden zu holen und stellst fest, dass keiner mehr da ist → Fehlermeldung. Zu diesem Zeitpunkt ist der Stack leer. “Der Keller soll in diesem Fall leer bleiben.” heißt IMO dann, dass die schon rausgeholte 4 nicht wieder rein soll. Dementsprechend müsste es nach dem = auch eine Fehlermeldung geben.


4 -> push(4);
+ -> pop() + pop() -> NoSuchElementException.

Da erste pop() liefert die 4; das zweite, liefert nix, also eine Exception, da der Keller leer ist.


Wie sieht es mit solch einer Eingabe aus:

4
3
+
= bla bla

Soll man nur “=” betrachten und 7 ausgeben, oder Fehlermeldung?


“In einer Zeile steht jeweils nur ein Operand oder Operator”
Alles andere => nichts tun. Eine Fehlermeldung wäre hier Sinnvoll, ist aber nicht gefordert.

Zu blöd eine Exception zu fangen?
bräuchte mal Hilfe beim Exception-Fangen… bin irgendwie zu blöd dafür. :scared:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Stack

//...
public Double pop() throws NoSuchElementException{
       //...
}

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Calculator

//...

run(){    //oder so ähnlich

    //...
   Double a;

   try{
        a = keller.pop();
   }
   catch(NoSuchElementException e){
        //Fehlerausgabe
   }

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Jetzt sagt mir Eclipse: Unhandled Exception in der Zeile: a = keller.pop();

=>aber so fange ich immer Exceptions, was hab ich verplant??? (übrigens: meinen Stack hab ich halt Keller genannt also ned wundern :-D)

Danke schon mal :wink:


also in dem Codeschnipsel kann ich grad auch keinen Fehler entdecken.


Nicht nur Eclipse, sondern die JVM.
Das passiert wenn man eine Exception deklariert und sie nicht wirft, oder sie wirft aber nicht deklariert.

public void run() throws IOException {

if (stack.isEmpty())
            throw new NoSuchElementException(

Danke schon mal, aber ich hab noch nicht wirklich verstanden, wo der Fehler liegt… Aber ich muss schon beim throw suchen, soweit ich es verstanden hab…?


es geht zwar aus deinem codequote nicht hervor, aber ich vermute mal du hast eben

throw new NoSuchElementException(

vergessen. Also in der Methode den Fall wenn die Exception geworfen wird.


Du fängst mit deinem Code nur Exceptions vom Typ NoSuchElementException (oder davon abgeleitete Klassen). Eine IOException oÄ wäre somit “unhandled”. Prüf also mal, ob du in deiner Stack Klasse andere Exceptions wirfst, vllt liegt da der Fehler.

Alternativ: catch (Exception ex)


ja sry, wenn ich mehr poste heißt’s wieder: “unser Plagiat-Programm is angesprungen”

aber trotzdem danke… hab ja auch noch ne Woche Zeit den Fehler zu finden :wink:
THX!


Edit: Fehler gefunden! Wen’s interessiert: ich hatte nur in einer der beiden Dateien

import java.util.NoSuchElementException;

eingebunden. Nicht in beiden… Oh man -.-’

Bonusblatt
Hallo,

ich hab ein Problem mit dem Testen des Taschenrechners. es heißt

führen sie dazu java Calculator <test00.in aus. Bei mir passiert da gar nix… Muss ich am Code irgendwas ändern? Ansonsten funktioniert das Teil, auch wenn ich die Tests per Hand ausführe. Kann mir da jemand helfen?

thx sotsoguk


Das “<” Zeichen bewirkt, dass dein Programm als Input den Inhalt der Datei test00.in verwendet. Wenn du den Befehl so eingibst, dann muss die Datei im gleichen Ordner wie die Calculator.class liegen.

Als Ausgabe müsste bei Test00 eigentlich “5.0” in der Konsole erscheinen.


Danke, das war mir (leider) klar dass es das bewirkt. Ich weiß auch was rauskommen sollte (bei per Hand eingabe klappts auch). Nur wenn ich eingeben java Calculator <Test00.in dann passiert nichts, er wartet ganz normal auf meine normalen Eingaben. Also ihr habt an der main-Methode nichts verändert??

thx


Sowohl main Methode als auch die for Schleife sind bei mir unverändert geblieben, und es geht.

Hast du n Leerzeichen zwischen < und test00.in?


[edit]
ich hab grad meinen fehler bemerkt. programmiere immer noch mit np++ und anscheinend kann dort die terminal erweiterung mit dem „<“ nicht richitg umgehen. unter der xp konsole gehts.doofer fehler!!
[/edit]

Ich habs mit beidem probiert, geht aber unter XP nicht, hab grad mal ubuntu gebootet, und dort gehts einwandfrei, keine ahnung warum. auf jeden fall läuft das ding wie es soll.
noch eine andere frage bei dem thema:

wenn ich meine calculator.java unter ubuntu compiliere muss ich dem compiler mitteilen, „use 1.5 compliance“ sonst bringt er mir schwierigkeiten mit den generics, kann mir jmd (nur knapp!) erklären warum dass unter xp nicht so ist?

thx ia sotsoguk


Möglicherweise hast du unter Ubuntu einen anderen Compiler installiert als unter Windows. Mittels [m]update-alternatives[/m] kannst du dir (unter Ubuntu) die verfügbaren Alternativen bei dir ausgeben lassen. Bei mir ist beispielsweise der Compiler von Sun installiert (wahrscheinlich auch deiner unter Windows):

update-alternatives --list javac
/usr/lib/jvm/java-6-sun/bin/javac

danke, ich hab schon mal sowas gelesen dass unter ubuntu / debian von haus aus eine andere jdk installiert ist, werd das dann mal morgen probieren.

gruß sotsoguk