Hallo,
ich habe die Aufgabe einen Syntaxchecker in Java zu programmieren,
der einen vorgegebenen J.Unit test erfolgreich absolviert.
Die Methode public static void parse(String kd) throws ParseException
ist vorgegeben, die restlichen Methoden habe ich bereits programmiert.
Ich versuche also rekursiv den Syntaxbaum zu überprüfen, jedoch erfüllt
es mir keinen J-Unit Test:
1
package u3a3;
2
3
public class KD {
4
5
private static int offset = 0;
6
/**
7
* Parse a "Klammerdarstellung" (KD) of a tree.
8
*
9
* <ul>
10
* <li>An empty tree is encoded as '-'.</li>
11
* <li>A node is encoded as an uppercase letter, i.e. everything accepted by {@link Character#isUpperCase(char)}.</li>
12
* <li>Children are appended to the father as a ','-separated list of nodes enclosed in round brackets.</li>
13
* </ul>
14
*
15
* @param kd Tree encoded in KD
16
* @throws ParseException if the given String is not a valid KD of a tree.
17
*/
18
19
public static void parse(String kd) throws ParseException
Da du niergends eine Parseexception wirfst, der Test aber eine erwartet
schlägt er fehl.
Was würdest du auch von einem Compiler halten welcher Kommentarlos jeden
Unsinn aktzeptiert und keine Ausgaben macht egal ob richtig oder falsch?
@Läubi
ich glaub nicht, dass das stimmt, was du schreibst
throws heitß ja nur dass man eine Parseexception werfen KÖNNTE
und nicht dass man das MUSS
(wird man vermutlich nur tun, wenn man das scheitern eines tests
kommunizieren will
>von einem Compiler
ich glaub nicht, dass er ein Problem beim compilieren hat ...
@TO
class Tests {
fehlt da ein "extends" ??
Ich begreiffe einfach diesen JUnit Test nicht, ich weiss gar nicht was
ich überhaupt erfüllen soll? Was muss ich machen, dass es mir die
Exceptions richtig erfüllt?
Hi,
wieso sollte eine Exception erkannt werden, wenn du exception = true;
setzt?
Vll. solltest du erst mal nachschlagen, was Exceptions sind und wozu sie
verwendet werden.
Anstelle von exception = true wirfst du einfach eine Exception wenn
einer deiner Tests fehlgeschlagen ist:
throw new ParseException();
Natürlich sollte die ParseException Informationen über die Fehlerquelle,
Position etc. enthalten...
Robert L. schrieb:> @Läubi>> ich glaub nicht, dass das stimmt, was du schreibst> throws heitß ja nur dass man eine Parseexception werfen KÖNNTE> und nicht dass man das MUSS
Aber
> @Test(expected = ParseException.class)>> ich glaub nicht, dass er ein Problem beim compilieren hat ...>>> @TO>> class Tests {>> fehlt da ein "extends" ??
extends TestCase wurde mit JUnit 4 abgeschafft.
Du bist wohl noch bei JUnit 3?;-) Ich auch...
mfg Andreas
Robert L. schrieb:> ich glaub nicht, dass das stimmt
Glauben heißt nicht wissen, der JUnittest erwartet das die Exception
geworfen wird siehe weiter unten.
Hans Lüthi schrieb:> Ich begreiffe einfach diesen JUnit Test nicht, ich weiss> gar nicht was ich überhaupt erfüllen soll?
Dann sprich mit deinem Betreuer!
Hans Lüthi schrieb:> @Test(expected = ParseException.class)
Das sagt aus, dass der Test erwartet, dass die Methode eine Exception
vom Typ ParseException wirft. (siehe z.B.
http://radio.javaranch.com/lasse/2007/05/17/1179405760728.html)
Also, ich verstehe schon, dass die Ausnahmen als Exceptions geworfen
werden sollen, mit "throw new ParseException();" klappt das aber nicht,
zeigt mir Eclipse als Fehler an. Mit exceptions = true meine ich nur,
dass es sich um eine Ausnahme handelt, somit versuche ich zu verhindern,
dass es in den Syntaxchecker läuft. Wie aber werfe ich in Junit4 eine
exception?
Gruss Hans
The constructor ParseException() is undefined,
naja, sollte ich wohl noch einen Konstruktor machen,
weiss aber nicht warum ich bei ParseException nen Konstruktor brauche?
$
Edit: sehe gerade, der Konsturktor is in einer anderen Klasse definiert.
Also du scheinst wohl noch ganz am Anfang zu sein;-)
Bei Eclipse kannst du mit F2 die Dokumentation anzeigen lassen, und mit
F3 in die Sourcen springen (sofern vorhanden).
ParseException ist nirgends importiert, daher wird es wohl eine Klasse
in der gleichen Package sein.
Ich vermute mal diese Klasse hat einen Konstruktor der z.B. einen String
als Parameter verlangt, warscheinlich einen Fehler.
(Alles geraten, wissen kannst das nur DU).
dann würde es heissen throw new ParserException("Mein Fehler");
Aja, ganz wichtig: Wenn du auf den Fehler klickst (also das rote Icon an
der Linke Seite) sagt dir Eclipse oft einen Lösungsvorschlag.
Schau den dir mal an!
Meistens geht der in die richtige Richtung.
mfg Andreas
10 Tests werden noch nicht erfüllt. Das offset soll zeigen, ob die
Klammerdarstellung auch wirklich richtig ist.
Vielleicht sieht jemand noch einen Fehler.
Was sollen die ganze integer da? Und die Exeption kann man sofort werfen
wenn etwas schief lief, außerdem solltest du dich mal einigen wo du die
Klammer setzen willst oder einfach mit STRG+F mal den Source formatieren
lassen.
Außerdem wäre es ganz gut wenn du mal versuchst zu verstehen was da
abläuft anstelle aus allen möglichen Quellen was zusammenzukopieren.
Naja, das was da steht habe auch ich so gedacht und nicht einfach so
zusammenkopiert. Ich konvertiere die Chars in einen Integer um damit zu
sehen, ob es ein erlaubter Grossbuchstabe ist (Wert zwischen 64 und 91).
Die Bäume die ich überprüfe sind aus Grossbuchstaben, Kommas, Klammern
und "-" für keinen Baum.
Läubi .. schrieb:> Klammer setzen willst oder einfach mit STRG+F mal den Source formatieren> lassen.
STRG+SHIF+F, er will nicht suchen;-)
Hans Lüthi schrieb:> Naja, das was da steht habe auch ich so gedacht und nicht einfach so> zusammenkopiert. Ich konvertiere die Chars in einen Integer um damit zu> sehen, ob es ein erlaubter Grossbuchstabe ist (Wert zwischen 64 und 91).
Character.isLetter(ch)
Character.isUpperCase(ch)
Es gibt noch einige mehr, schaue die dir mal an.
Im übrigen ist es leserlicher (und ggf. sogar etwas schneller) wenn du
statt
> if ((kd.charAt(i) == '(' || kd.charAt(i) == ')' || kd.charAt(i) ==> ',' || kd.charAt(i) == '-' || ((int) kd.charAt(i) >= 65) && ((int)> kd.charAt(i) <= 90)))
etwas schreibst wie
> char c = kd.charAt(i);> if ((c == '(' || c == ')' || c == ',' || c == '-' || ((int) c >=> 65) && ((int) c <= 90)))
mfg Andreas