PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Unerklärlicher Methodenabbruch -> Programm läuft trotzdem weiter



Gekiganger
30.11.2004, 02:47
Ich habe ein Problem mit einer Methode, die sich anscheinend selbst abbricht, jedoch ohne dass eine Fehlermeldung erscheint.
Alle übergeordneten Methoden brechen nach Aufruf ihrer Untermethoden, die zu dieser Methode führen, ebenfalls ab, bis zur obersten Methode, die trotzdem weiter läuft, sprich, das Programm läuft weiter, nur ein Methodenzweig beendet sich völlig von selbst.


Diese Methode soll folgendes tun:
Aus einer Datei soll sie die Nummer eines Befehls, von einem Kommazeichen aus nach links, ermitteln. Solch eine Datei sieht z.B. folgendermaßen aus:



VDE0701,2.01
1,XXXXXXXX 2,000120000000500000000C000000050000000000 5,09.11.04 6,15:21:53 7, +0.061ê 8,<0.300ê 11,>+310.0Mê 12,>0.500Mê 13, +0519V 14,+0500V 27,@435 52,+253.0V 55,09.11.04 56,15:35 56,Monitor 60,3496 75,0001

Erläuterung:
Zeile 0 ist uninteressant, sie ist lediglich eine Kopfzeile.
In Zeile 1 sind die Befehle enthalten.
Ein Befehl setzt sich aus seiner ID zusammen, gefolgt von einem Komma, welches den Befehlsinhalt ankündigt. Dieser erstreckt sich bis zum NIL (hier als Leerzeichen dargestellt), warauf der nächste Befehl folgt.


Und hier die methode, die die Befehls- ID links vom Komma ermitteln soll:


public static int sucheBefehlsNummer(int feld[][], int p, int q)
{
int befehlsNummer = 0,
i = 1;

System.out.println("Dieser Text wird gedruckt");
for(q = q-1 ; ((feld[p][q] != 0) && (q >= 0)) ; q--, i*=10)
{
befehlsNummer += (feld[p][q] - 48) * i;
System.out.println("Auch dieser Text wird gedruckt");
}
System.out.println("Dieser Text wird nichtmehr gedruckt..");
return befehlsNummer;
}

Die Methode bekommt den Array feld[][], welcher die Datei (Zeichen als ASCII Werte) darstellt, geliefert, die Zeile p in der gesucht werden soll, sowie die Position des aktuellen Kommas q, von der aus der Befehl identifiziert werden soll.
Vom Komma aus sucht sie sich nun, nach links, alle ASCII Zeichen zusammenn, wandelt sie in Integer Werte um und fügt diese zu einem ein- oder mehrstelligen Wert zusammen, solange, bis ein NIL gefunden wurde oder der Anfang des Arrays erreicht ist.

An dieser Stelle sollte nun eigentlich das return greifen, was es jedoch nicht tut. Die Methode wird nach der Schleife beendet, sie kommt, wie man durch den print Befehl sehen kann garnicht erst soweit.


Um mal ein Beispiel anhand des Auszugs aus der Datei von oben durchzugehen:

In der Datei wird in Zeile 1 an der Position 1 ein Komma gefunden.
Die Methode sucheBefehlsNummer wird aufgerufen. Ihr wird die Datei feld übergeben, die aktuelle Zeile p und die Position in der Zeile q.
Durch die schleife wird q erstmal um 1 verringert, es Zeigt nun also auf die Position 0, in der sich laut Datei eine 1 (ASCII = 49) befindet. Die Schleifenbedingungen sind also erfüllt, q ist größer gleich 0 und der Inhalt des Feldes an der Position ist nicht NIL.
Der Schleifeninhalt wird nun bearbeitet, der ASCII Wert von feld an der aktuellen Position wird um 48 verringert. Da er 49 war, ist er nun 1. Dieser wird nun noch mit dem Multiplikator multipliziert, woraus sich ebenfalls eine 1 ergibt. Das Ergebnis wird zu befehlsNummer addiert.
Die Schleife ist zuende, q wird um 1 verringert und der Multiplikator um eine Zehnerpotenz erweitert.
Doch nun ist die Schleifenbedingung nichtmehr erfüllt. q ist nun -1, jedoch darf es nicht kleiner als 0 sein, die Schleife wird also abgebrochen.
An dieser Stelle sollte der print Befehl kommen, gefolgt vom return, stattdessen aber wird die ganze Methode schlagartig beendet.



Tjo und meine Frage nun, wie kann so etwas passieren? Wieso geht nach der Schleife nichts mehr? In einer Endlosschleife kann ich mich ja schlecht befinden wenn das Programm trotzdem fortfährt.
Will mich Java ärgern oder was?
Fragen über fragen..

Gekiganger
30.11.2004, 10:23
OK hat sich erledigt.
Musste nur die Bedingungen der Schleife tauschen... dass keine Fehlermeldung kam lag wohl daran, dass die Methode, von der dritten übergeordneten Methoden, aus einer try-catch Anweisung heraus gestartet wurde.
Merke: man sollte um halb 3 morgens kein Bugfixing mehr betreiben. >.<