Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe das Konzept mit den Instanzen einer Klasse noch nicht so 100pro verstanden:
Ich mache per
Code:
Seitentest Testen = new Seitentest();
Testen.DoTest(myStringList.getFirst().toString());
mehrere Instanzen von Seitentest. Seitentest selbst enthält mehrere klassenglobale Variablen. Der Test über den ersten String läuft bestens, allerdings wenn die zweite Instanz erstellt wird übernimmt er die Werte der globalen Variablen aus der ersten Instanz. Bei der dritten usw. ist das auch so. Kann man das nicht so machen, dass jede Instanz mit den Startwerten aufgerufen wird???
public class Seitentest{
static boolean Scripte = false;
static boolean Tabellen_Design = false;
public void DoTest(String akuellesElement){
Tidy Test = new Tidy();
// Die Ausgabe von Fehlern in Datei umleiten
try {
FileWriter rawOut = new FileWriter( "errors.txt" );
PrintWriter out = new PrintWriter( rawOut );
Test.setErrout(out);
Test.setErrfile("errors.txt");
}
catch ( IOException error ) {
System.err.println( "Error writing to output file: " + error );
}
String sourceUrlString=akuellesElement;
if (sourceUrlString.indexOf(':')==-1)
sourceUrlString="file:"+sourceUrlString;
URL sourceUrl;
try {
sourceUrl = new URL(sourceUrlString);
InputStream in;
try {
in = sourceUrl.openStream();
Document tidyDOM = Test.parseDOM(in, null);
Node n = tidyDOM.getFirstChild();
n = n.getParentNode();
iterateChildren(n);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(Scripte) System.out.println("Die Seite " + sourceUrlString + " enthält Skripte"); else System.out.println("Die Seite " + sourceUrlString + " enthält keine Skripte");
if(Tabellen_Design) System.out.println("Die Seite " + sourceUrlString + " enthält Tabellen fürs Design"); else System.out.println("Die Seite " + sourceUrlString + " enthält keine Tabellen fürs Design");
}
public static void iterateChildren(Node n) {
NodeList list = n.getChildNodes();
for(int i = 0; i < list.getLength(); i++) {
Node child = list.item(i);
if(child.getNodeType() == 1) {
Scripte = Scripte || (child.getNodeName().equals("script")) ;
if(n.getNodeName().equals("table")) Tabellen_Design = Tabellen_Design || Test1.Check(n);
}
iterateChildren(child);
}
}
}
DoTest wird aus einer anderen Klasse aufgerufen, nämlich Fassade
Code:
public class Fassade {
/**
* This Method will collect all the Information needed for the tests
*
* @param LinkedList : List with all collected URLs
*
*/
public static void StartTests(LinkedList myStringList) {
while(myStringList.isEmpty() == false) {
Seitentest Testen = new Seitentest();
Testen.DoTest(myStringList.getFirst().toString());
//System.out.println(myStringList.getFirst().toString() + " war vorhanden und wird entfernt");
myStringList.removeFirst();
}
}
}
Es wird dabei eine Baumstruktur durchsucht, wenn etwas (table tag) gefunden wird dann wird Test1.Check aufgerufen, der innerhalb des übergebenen Knotens (bzw subtree) nach img-Tags sucht. Dabei tritt immer das im ersten Post genannte Problem auf, sprich sobald die Variable erstmals true ist ist sie auch in den anderen folgenden Instanzen true :-(
static bedeutet unabhängig von der Instanz.
Egal wieviele Instanzen einer Klasse du anlegst, die static-Teile existieren nur 1mal.
Deshalb wird static in OOP auch nur sehr ungern und nur für spezielle Fälle verwendet, mach es weg.