xml jdom und jbuilder

melmager

Erfahrenes Mitglied
Ich vermute mal das mein jbulder immer noch nicht die jdom Lib kennt :-)
ich bekomme sehr merkwürdige fehlermeldungen

so sieht der code aus der grösste teil ist geklaut :-)
Code:
import java.io.*;  // neccessary for file handling
import java.util.*; // neccessary for container classes
import org.jdom.*;
import org.jdom.input.SAXBuilder;
public class impad {
  public static Document getDocument(String filename) {
    try {
      SAXBuilder builder = new SAXBuilder(true);
      return builder.build(new File(filename)); // return the parsed document
    }
    catch (JDOMException e) {
      System.out.println(e);
      System.exit(1);
    }
    return null; // is never reached
  }
  public static void main(String argv[])
  {
    //if (argv.length != 1){
    //  System.out.println("This program returns data");
    //  System.out.println("Usage: java Theatre2 <Play> ");
    //  System.exit(1);
    //}

    // create the jdom -  document
    Document doc = getDocument("2650.xml");
    // get access to the root element
    Element root = doc.getRootElement();
    System.out.println(GetName());
  }
}
und das ist der fehler:
Exception in thread "main" java.lang.NoClassDefFoundError: impad

liegt es am code oder doch an der jdom lib ? das jbulder die noch nicht kennt?
 
Die Fehlermeldung besagt er findet die Klasse
impad nicht.

Das hat nicht primär was mit JDOM zu tun, sondern
du hast deine Klasse impad nicht gefunden was daran
liegen kann das das File der Klasse nicht impad.java
heisst.

Zudem solltest du alle Klassenamen mit Grossem ersten
Buchstaben schreiben, das ist offizieller Java Stileguide.

Wie heisst die Datei in der impad liegt?
 
häh ...
mit andern Worten dasFile muss immer so heissen wie die Hauptklasse?

Ihhh warum steht das nirgens in den Büchern....

Aber nachdem ich das File umbenannt habe kommen wenigstens mehr Fehlermeldungen :-)

kann verzeichnis org.jdom nicht finden wie nett

wieso Verzeichnis
 
Original geschrieben von melmager
häh ...
mit andern Worten dasFile muss immer so heissen wie die Hauptklasse?

Ihhh warum steht das nirgens in den Büchern....

Aber nachdem ich das File umbenannt habe kommen wenigstens mehr Fehlermeldungen :-)

kann verzeichnis org.jdom nicht finden wie nett

wieso Verzeichnis

Weil die Klassen (innerhalb eines jar Files) immer den Verzeichnissen gepackt sind, wie sie in den Namespaces liegen.

Sprich die Klasse de.holyfly.Test
liegt in
de/holyfly/ verzeichnis.

Das liegt dann schon daran das das Jar file nicht korrekt eingebunden worden ist.
Wie gesagt, JBuilder muss ich passen, unter eclipse kann ich dir das erklären.
 
Also soweit ich die beschreibung von JDOM verstanden habe
muss nur ein Link zum jdom.jar vorhanden sein
ich habe das ding mal ich das verzeichnis von den anderen *.jar von Jbuilder
reingeworfen - das wars leider auch nicht

Eclipse habe ich mir mal beide Versionen runtergeladen
die motif und die gtk Version die angeblich nach dem readme beide auf mein
Suse 8.1 laufen sollen - pustekuchen

gtk vermisst eine libgtk_x11 die bei Suse nicht dabei ist
und die Motif-version haut mir ein Errorcode -1 um die Ohren

was ich jetzt noch nicht verstanden habe:

warum nennt sich das beim Include org.jdom
das file ist doch jdom.jar und nicht org.jar
das org ist aber in jedem Beispiel zu sehen was ich bisher gelesen habe

da ja das File so heissen muss wie die Klasse verstehe ich jetzt nicht wo
das org her kommt - ist warscheinlich Gottgegeben

import org.jdom.*;
ok hier scheint er die ganze classe einzufügen * steht normal für alles :-)
import org.jdom.input.SAXBuilder;
aber warum dann den speziell ? der muss doch schon da sein

Alles etwas merkwürdig und völlig undurchsichtig
 
Zuletzt bearbeitet:
Original geschrieben von melmager
Also soweit ich die beschreibung von JDOM verstanden habe
muss nur ein Link zum jdom.jar vorhanden sein
ich habe das ding mal ich das verzeichnis von den anderen *.jar von Jbuilder
reingeworfen - das wars leider auch nicht

Eclipse habe ich mir mal beide Versionen runtergeladen
die motif und die gtk Version die angeblich nach dem readme beide auf mein
Suse 8.1 laufen sollen - pustekuchen

gtk vermisst eine libgtk_x11 die bei Suse nicht dabei ist
und die Motif-version haut mir ein Errorcode -1 um die Ohren

was ich jetzt noch nicht verstanden habe:

warum nennt sich das beim Include org.jdom
das file ist doch jdom.jar und nicht org.jar
das org ist aber in jedem Beispiel zu sehen was ich bisher gelesen habe
Wegen der libgtk_x11.
Im zip File ist eine .so Datei, diese nach /usr/local/lib werfen ldconfig laufen lassen, sollte Problem beheben.

wegen org.jar
Weil es sich nicht um das importieren eines Jar files handelt sondern um den
Import eines Namespaces. Und der namespace lautet org.jdom

Original geschrieben von melmager

da ja das File so heissen muss wie die Klasse verstehe ich jetzt nicht wo
das org her kommt - ist warscheinlich Gottgegeben
import org.jdom.*;


Siehe oben.

Original geschrieben von melmager

ok hier scheint er die ganze classe einzufügen * steht normal für alles :-)
import org.jdom.input.SAXBuilder;
aber warum dann den speziell ? der muss doch schon da sein
Alles etwas merkwürdig und völlig undurchsichtig

Nein nicht undurchsichtig, sondern logisch, sobald mann das konzept verstanden hat.
tiere.vierbeiner.*;
importiert alle enthaltenen Klassen
tiere.vierbeiner.Giraffe
tiere.vierbeiner.Elefant

Aber es importiert nur die Klassen, und nicht
subnamespaces.
 
ok nach dem ich noch ein link gesetzt habe findet mein Jbuilder meine JDOM Klasse :-)
also zwei links setzen einen für den Jbulder und ein ein fürs aktuelle Projekt :-)

jetzt mault er noch die zeile an:

return builder.build(new File(filename)); // return the parsed document

die ich so geklaut habe :-)

"impad.java": Fehler #: 360 : Nicht bekannte Exception java.io.IOException; muss abgefangen werden oder zum Auslsen deklariert werden in Zeile 9, Spalte 22

spalte 22 ist das mit build

Nachtrag zu Eclipse:

Im zip File ist eine .so Datei, diese nach /usr/local/lib werfen ldconfig laufen lassen, sollte Problem beheben.

nee leider nicht vorhanden das file; da muss ich wohl mal tante googel fragen - irgendeiner muss das Ding doch schon mal zum laufen bekommen haben :-)
 
Zuletzt bearbeitet:
melmager hat gesagt.:
ok nach dem ich noch ein link gesetzt habe findet mein Jbuilder meine JDOM Klasse :-)
also zwei links setzen einen für den Jbulder und ein ein fürs aktuelle Projekt :-)

jetzt mault er noch die zeile an:

return builder.build(new File(filename)); // return the parsed document

die ich so geklaut habe :-)

"impad.java": Fehler #: 360 : Nicht bekannte Exception java.io.IOException; muss abgefangen werden oder zum Auslsen deklariert werden in Zeile 9, Spalte 22

Kannst dich noch errinnern in dem Thread PHP Programmierstil, habe ich genau dies als grossen Vorteil von Java erleutert.
Den muss, mögliche Ausnahmen abzufangen und zu behandeln.

Zur erklärung: die methode build(File) liest aus einer Datei ein Dokument und gibt
ein Object der Klasse Document zurück.
Bei dieser Leseoperation können Fehler auftreten, obwohl der Code richtig ist. Z.b ist das File Korrupt und lässt sich nicht komplett lesen, oder es existiert kein Leserecht darauf usw.
Java zwingt dich nun dich mit diesem Problem zu beschäftigen.
Das heisst dir stehen jetzt 2 Wege offen: Du behandelst eine mögliche Ausnahme oder gibst sie an den Aufrufer weiter.
Das sieht folgendermassen aus:

Variante 1:
Code:
try {
  // etwas möglicherweise problematisches machen
} catch(Exception e) {
  // Ausnahme abfangen
} finally {
  // aufräumarbeiten durchführen.
}
Hierbei ist finally optional.

Variante 2:
Code:
public void aufrufer() {
  try {
      tuWasProblematisches();
  } catch (Expcetion e) {
     System.out.println("Dumm gelaufen, Fehler: e.getMessage());
  }
}
private void tuWasProblematisches() throws Exception {
 // etwas problematisches tun
}

In Variante 1 wird in einem try Block etwas problematisches versucht (try).
Beim Auftreten einer Ausnahme wird ein passender Catch block gesucht, der
die best passende Exception Klasse als Parameter aufweist. Sprich bei ioexception und 2 catchblöcken
Beispiel:
try {
// Dateioperation
} catch(IOException e) {
// fehler io
} catch(SQLException e) {
//fehler sql
}
wird die IOException angesprungen. Wenn kein passender Catch Block existiert, so wird nach Oberklasse der IOException gesucht, sprich z.b Exception. Wird auch das nicht gefunden so meldet der Compiler schon zur Kompilierzeit einen Fehler.

Variante 2 wirft die Exception einfach weiter zum Aufrufer, das dieser sich darum kümmern soll. Entweder wirft dieser Aufrufer (eine methode) diesen wiederrum weiter oder kümmert sich mit dem try {} catch {} darum.

Verständlich? Ansonsten:
javabuch.de -> Ausnahmebehandlung

Also in deinem Beispiel:
Code:
try {
  return builder.build(new File(filename)); // return the parsed document
} catch(IOException e) {
  System.out.println("Fehler bei Leseoperation"+e.getMessage());
  System.out.prinln("Stacktrace\n"+e.printStackTrace());
}
Oder aber die Methode so umschreiben das
public irgendwas einMethodenname() throws IOException {
}

Natürlich musst du auch diese Klasse IOException importieren.

melmager hat gesagt.:
nee leider nicht vorhanden das file; da muss ich wohl mal tante googel fragen - irgendeiner muss das Ding doch schon mal zum laufen bekommen haben :-)
Ja ich habe es z.b zum laufen bekommen, motif und gtk version ;)
 
Stand Eclipse installation:

Habe festgestell das ich gtk2 brauche aber um das in Sytem einzubauen brauche ich wieder
jede Menge andre Libs - das würde zu einer Installationsorgie führen.
so wies aussieht brauche ich minimum Suse 8.2 mal sehen ob ich die mal runtersauge :-)
aber selbst wenn - Es scheint dann noch ein paar Sprachprobleme oder Zeichensatzprobleme bei Suse mit Eclipse zu geben :-(

Ich finds nur lustig das der Code aus einem Beispielcode stammt - und nachdem was ich
nun weiss nie so gelaufen ist.

Schimpfmodus on:
Das nenne ich doch Einführung in eine Sprache - ich mache ein Democode der nicht
gehen kann und der Einsteiger darf sich damit rumägern.
Damit lernt er erst mal was alles nicht geht und freut sich über Kleinigkeiten die gehen :-)
Nach dem Motto:
Fahrlehrer zum Schüler: Da es ihre erste Fahrstunde ist üben wir mal rückwärts einparken an einer steilen Strasse ...
Schimpfmodus off

:-) Nein java du bekommst mich nicht klein :-)
Dann kann ich demächst wenigstens auf höheren Level lästern *g*

aber Zurück zum Thema:

try {
return builder.build(new File(filename)); // return the parsed document
} catch(IOException e) {
System.out.println("Fehler bei Leseoperation"+e.getMessage());
System.out.prinln("Stacktrace\n"+e.printStackTrace());
Sxstem.exit(1);
} catch (JDOMException e) {
System.out.println(e);
System.exit(1);
}

die Richung ? für beide Fehler möglichkeiten ?

So So - dann kann der ja auch nicht gehen :-)
http://www.tutorials.de/forum/showthread.php?threadid=66060

Nicht hauen - duck *g*

Kannst dich noch errinnern in dem Thread PHP Programmierstil, habe ich genau dies als grossen Vorteil von Java erleutert.

Klar kann ich das :-) der Thread ist die wahrgemache Drohung das ich meine Problem hier abladen werde -
smile
 
Zuletzt bearbeitet:
melmager hat gesagt.:
Stand Eclipse installation:

Habe festgestell das ich gtk2 brauche aber um das in Sytem einzubauen brauche ich wieder
jede Menge andre Libs - das würde zu einer Installationsorgie führen.
so wies aussieht brauche ich minimum Suse 8.2 mal sehen ob ich die mal runtersauge :-)
aber selbst wenn - Es scheint dann noch ein paar Sprachprobleme oder Zeichensatzprobleme bei Suse mit Eclipse zu geben :-(

Ich finds nur lustig das der Code aus einem Beispielcode stammt - und nachdem was ich
nun weiss nie so gelaufen ist.

Schimpfmodus on:
Das nenne ich doch Einführung in eine Sprache - ich mache ein Democode der nicht
gehen kann und der Einsteiger darf sich damit rumägern.
Damit lernt er erst mal was alles nicht geht und freut sich über Kleinigkeiten die gehen :-)
Nach dem Motto:
Fahrlehrer zum Schüler: Da es ihre erste Fahrstunde ist üben wir mal rückwärts einparken an einer steilen Strasse ...
Schimpfmodus off

Jetzt muss ich mal zurückschimpfen.
JDOM ist ein Zusatzmodul zur Sprache. Ist nicht dafür gedacht grundlegende Kentnisse in Java zu erhalten. Um diese zu erhalten beschäftigt mann sich mit
den Grundlagen bis mann diese beherrscht und widmet sich dann tiefergehende
Funktionaltäten.
Wer kein PHP kann, sollte auch nicht gleich versuchen mit PEAR zu arbeiten.

melmager hat gesagt.:
:-) Nein java du bekommst mich nicht klein :-)
Dann kann ich demächst wenigstens auf höheren Level lästern *g*

aber Zurück zum Thema:

try {
return builder.build(new File(filename)); // return the parsed document
} catch(IOException e) {
System.out.println("Fehler bei Leseoperation"+e.getMessage());
System.out.prinln("Stacktrace\n"+e.printStackTrace());
Sxstem.exit(1);
} catch (JDOMException e) {
System.out.println(e);
System.exit(1);
}

die Richung ? für beide Fehler möglichkeiten ?

So So - dann kann der ja auch nicht gehen :-)
http://www.tutorials.de/forum/showthread.php?threadid=66060

Nicht hauen - duck *g*


Klar kann ich das :-) der Thread ist die wahrgemache Drohung das ich meine Problem hier abladen werde -
smile

Ist ja auch kein Problem, dennoch solltest du dich mit den Grundlagen beschäftigen, dinge wie Namespaces und Exceptions gehören dazu ;)

Zu dem Codebespiel:
Weiss nicht ob der jetzt lauffähig ist, denn die Methode hat einen kleinen Fehler.
Sie liefert unter Umständen keine Rückgabe.
Ob der Compiler nicht meckert da die ganze Applikation beim auftreten eines Fehlers beendet wird, weiss ich jetzt nicht. Falls ja dann setze noch jeweils ein
return null; dazu. Ansonsten ist dies korrekt. Wobei ich aufgrund besseren
Codestil das Beispiel folgendermassen umschreiben würde:
Code:
.....
try {
  Document tmp =  builder.build(new File(filename)); // return the parsed document
} catch(IOException e) {
  System.out.println("Fehler bei Leseoperation"+e.getMessage());
  System.out.prinln("Stacktrace\n"+e.printStackTrace());
  Sxstem.exit(1);
} catch (JDOMException e) {
      System.out.println(e);
      System.exit(1);
} 
  return tmp;
}

grüsse
:)
 
Zurück