Unterschiedliche Resultate bei RUN und DEBUG !?

Status
Nicht offen für weitere Antworten.

norman

Top Contributor
Hallo zusammen,

habe immernoch das Ziel eine Java-Klasse auszulesen und deren Methoden in *.txt files zu schreiben. Die txt-Files sollen nach den Methoden benannt sein. Hierfür verwende ich
Code:
		Class c1 = Class.forName(classFileLocation);  /* throws ClassNotFoundException */
		methods = c1.getDeclaredMethods();
		String[] methodNames = new String[methods.length];
		for (int i=0; i< methods.length; i++) {
			methodNames[i] = methods[i].getName();			
		}

In die Datein wird dann der Quellcode der Funktion geschrieben. Dazu lese ich die Zeilen aus der *.java-Datei aus.

Das Problem: STarte ich das Programm normal, schreibt er mir z.B. die Methode A in die Datei B.txt und die Methode X in Datei F.txt usw.
Beim Start im DEBUG-Modus schreibt er in die richtigen Dateien.

Grund: Der oben genannte Code liefert im RUN und DEBUG Modus unterschiedliche Werte. Beispiel:
RUN-Modus:
methodNames[0] = fakul
methodNames[1] = main
methodNames[2] = addition

DEBUG-Modus:
methodNames[0] = main
methodNames[1] = fakul
methodNames[2] = addition

Hat jemand eine Idee wo hier der Fehler steckt?


Grüße
Norman
 

Murray

Top Contributor
Laut Sun-Doku ist die Reihenfolge der Methoden bei getDeclaredMethods() nicht bestimmt, daher ist schwer zu sagen, welche Reihenfolge denn die "richtige" ist - Du kannst Dich auf keine bestimmte Reihenfolge verlassen.
 

norman

Top Contributor
im prinzip ist mir die reihenfolge auch egal, aber sie sollte doch übereinstimmen. wieso findet genau die selbe methode unterschiedliche methoden zuerst, je nach dem, ob sie im run oder debug-modus gestartet wird?
 

norman

Top Contributor
das problem ist ja, dass er den quellcode der methoden aus der *.java datei liest, den methoden-namen aber mit getDeclaredMethods() aus der *.class Datei. Wenn er jetzt die methoden-namen in unterschiedlichen reihenfolgen ermittelt, schreibt er auch den quellcode in unterschiedliche dateien
=> wie könnte ich es umsetzen, dass er mir z.B. die methoden-namen so ermittelt, wie sie auch der reihenfolge nach im quellcode vorkommen? (da es sehr aufwendig wäre aus der *.java-Datei die methodennamen zu suchen, bin ich ja auf die getDeclaredMethods() gekommen..)

Grüße
Norman
 

Murray

Top Contributor
norman hat gesagt.:
im prinzip ist mir die reihenfolge auch egal, aber sie sollte doch übereinstimmen

Eben nicht. Strenggenommen darf man nichtmal davon ausgehen, dass man bei zwei aufeinanderfolgenden Aufrufen die gleiche Reihenfolge erhält (auch wenn das meist der Fall sein dürfte).

Warum im Debug-Modus eine andere Reihenfolge kommt, ist schwer zu sagen. Wie definierst Du denn Debug-Modus? Meinst Du den von Eclipse, oder arbeitest Du mit einer anderen IDE?
 

norman

Top Contributor
Ich meine den in Eclipse. Wobei es da auch ausreicht, den Breakpoint in die erste Zeile zu setzen und dann mit F8 das Programm ohne weitere Unterbrechung zu Ende zu führen..
 

Sky

Top Contributor
Ich verstehe (leider) nicht ganz was Du willst: Wenn es Dir aber in irgendeinerweise auf gleiche Reihenfolgen ankommt, so könntest Du doch einfach sortieren und hättest immer die gleiche Reihenfolge, oder ?
 

norman

Top Contributor
Hallo,

ja, klar. allerdings müssten dann die methoden auch in der *.java in sortierter reihenfolge auftauchen.

Code:
package struktoGen;

import java.io.*;
import java.lang.reflect.Method;

/**
 * Splits the given *.java in *.txt files which each contain exactly 1 method
 * @author Norman
 */
public class FileSplitter {
	
	boolean classFolderWasCleared = false;
	File dir = new File(this.getClass().getName()); 	/* directory (classname) including classe's methods */ 
	int methodCount = 0; 			/* number of methods */
	Method[] methods;
	int open; 						/* number of opened bracets (to get method's end)*/

	/**
	 * @param javaFile file-object which will be splittet in *.txt files for each method
	 * @param classFileLocation String like "package.className"
	 * @throws ClassNotFoundException 
	 */
	FileSplitter(File javaFile, String classFileLocation) throws ClassNotFoundException {
		
		Class c1 = Class.forName(classFileLocation);  /* throws ClassNotFoundException */
		methods = c1.getDeclaredMethods();
		String[] methodNames = new String[methods.length];
		for (int i=0; i< methods.length; i++) {
			methodNames[i] = methods[i].getName();
			System.out.println("MethodenNamen: " + methodNames[i]);
		}

		System.out.println("Datei: " + javaFile.getAbsolutePath());
		System.out.println("Größe: " + javaFile.length() + " Bytes\n\n");
		
		try {
			BufferedReader reader= new BufferedReader(new FileReader(javaFile));
			while (true) {
				try {
					String line = reader.readLine();
					System.out.println("aktuelle Zeile: " + line);
					if (line != null) {
						if (isMethodStart(line)) { 		/* falls methode beginnt, suche nach ende */
							System.out.println("Datei wird erstellt: " +methodNames[methodCount]+".txt");
							createTxtFile(methodNames[methodCount]+".txt");
							System.out.println("Datei wird gefüllt: " +methodNames[methodCount]+".txt");
							fillMethodFile(methodNames[methodCount]+".txt", line);
							if (line.contains("{"))
								open=1; /* opened braces of method's first line */
							else
								open=0; 
							while (true) {
								String line2 = reader.readLine();
								System.out.println("aktuelle Zeile: " + line2);
								System.out.println("Datei wird gefüllt: " +methodNames[methodCount]+".txt");
								fillMethodFile(methodNames[methodCount]+".txt", line2);
								if (isMethodEnd(line2)) {
									break;
								}
							}
							methodCount++;
						}
					}
					else
						break;
				} 
				catch (IOException e) {
					e.printStackTrace();
				}
			}	
		} 
		catch (FileNotFoundException fnfe) {
			fnfe.printStackTrace();
		} 
	}
	
	/**
	 * deletes files in classFolder
	 * @return true if all files in classFolder have been deleted
	 */
	private boolean clearClassFolder() {
		File[] filesInDir = dir.listFiles();
		int deletionsCount = 0;
		for (int i=0; i < filesInDir.length; i++) {
			if (filesInDir[i].delete())
				deletionsCount++;
		}
		return (deletionsCount==filesInDir.length)? true : false;
	}
	
	/**
	 * creates new folder named [classname] if not exists, otherwise deletes folder's files.
	 * creates new txtFile if a method was Found. TxtFile will be named "methods[number_of_method]" and 
	 * stored in [classname]-folder
	 * @param file file to create 
	 * @return true if the file did not exist yet and was created successfully
	 */
	private boolean createTxtFile(String filename) {	
//		String filename = "methods[" + methodCount + "].txt";
		try {
			if (dir.exists() == false) {
				dir.mkdir();
				System.out.println("Verzeichnis wurde erstellt: " + dir);
				classFolderWasCleared = true;
			}
			else if (classFolderWasCleared == false) {
				classFolderWasCleared = clearClassFolder();
			}
			return new File(dir, filename).createNewFile();
		} 
		catch (IOException e) {
			System.out.println("Konnte Datei nicht erstellen:");
			e.printStackTrace();
		}		
		return false; /* this line will never be reached */
	}
	
	/**
	 * writes lines of code into the methodFile
	 * @param methodFileName name of methodFile
	 * @param line line of code to be written
	 */
	public void fillMethodFile(String methodFileName, String line) {
		File methodFile = new File(dir, methodFileName);
		
		line = line.concat("\n");
		
		try {			
			Writer out = new BufferedWriter(new FileWriter(methodFile, true));
			out.append(line);
			System.out.println("Zeile: " + line + "wurde geschrieben in: " + methodFile);
			out.flush();
			out.close();
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @param line line of code to check
	 * @return true if line of code shows that a method ends here
	 */
	private boolean isMethodEnd(String line) {
		boolean isMethodEnd = false;
		if (line.contains("{"))
			open+=1;
		if (line.contains("}"))
			open-=1;
		if (open==0)
			isMethodEnd = true;	
		return isMethodEnd;
	}

	/**
	 * @param line line of code to check
	 * @return true if line of code shows that a method starts here
	 */
	private boolean isMethodStart(String line) {
		boolean isMethodStart = false;
		
		if ( (!line.contains("=")) && (!line.contains("class")) && 
				( (line.contains("void")) || (line.contains("static")) || (line.contains("public"))	
				|| (line.contains("int")) || (line.contains("String")) || (line.contains("long")) ) )
			isMethodStart=true;		
		
		return isMethodStart;
	}
}
Code:
package struktoGen;

import java.io.File;

/**
 * starts the application
 * @author Norman
 */
public class Testklasse {

	public static void main(String[] args) {
		try {
			new FileSplitter(new File("struktoGen\\Struktogramm.java"), "struktoGen.Struktogramm");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}
}
Code:
package struktoGen;

public class Struktogramm {

	static int addition(int a, int b) {
		return a+b;
	}
	
	static long fakul(int zahl) {
		long fak=1L;
		for (int i=zahl; i>1; i--) {
			fak = fak * i;
		}
		return fak;
	}
	
	public static void main(String[] args) {
		addition(3,5);
		fakul(6);
	}

}
 

norman

Top Contributor
konnte das Problem lösen, indem ich vor dem Erstellen der Datei überprüfe, welchen String aus String[]=Klasse.getDeclaredMethods(); die erste Zeile der Methode im Quelltext beinhaltet.

(was aber nicht klärt, warum die Reihenfolge von getDeclaredMethods(); in RUN und DEBUG abweicht)

Grüße
Norman
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
T Unterschiedliche Datentypen - worin abspeichern? Java Basics - Anfänger-Themen 18
F Falscher Link zum Path? Unterschiedliche Antworten bei Eclipse und VisualStudiocode Java Basics - Anfänger-Themen 5
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
M Writer für unterschiedliche Obj/inbt/double erstellen? Java Basics - Anfänger-Themen 1
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
J Unterschiedliche Ordnerstrukturen trotz gleicher Entwicklungsumgebungen Java Basics - Anfänger-Themen 3
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
F Wie String in unterschiedliche Listen teilen Java Basics - Anfänger-Themen 7
J 2 Arrays vergleichen (Unterschiedliche Längen) Java Basics - Anfänger-Themen 42
F for schleife - stark unterschiedliche Berechnungszeit Java Basics - Anfänger-Themen 30
L Via Interfaces unterschiedliche Klassen ansprechen Java Basics - Anfänger-Themen 8
OnDemand Bindestrich unterschiedliche? Java Basics - Anfänger-Themen 3
O Unterschiedliche Attribute in Objekklasse? Java Basics - Anfänger-Themen 5
J Unterschiedliche Spaltengröße im Grid(bag)layout Java Basics - Anfänger-Themen 6
N Applets: unterschiedliche Java Versionen Java Basics - Anfänger-Themen 7
B Zwei Unterschiedliche Klassen bei Instanzierung Java Basics - Anfänger-Themen 5
S Datentypen Array fill Methode - unterschiedliche Datentypen Java Basics - Anfänger-Themen 6
B Wie kann ich unterschiedliche Datentypen in einem Feld abbilden? Java Basics - Anfänger-Themen 5
M Methode soll zwei unterschiedliche primitives zurückgeben Java Basics - Anfänger-Themen 7
R Unterschiedliche Initialisierungen Java Basics - Anfänger-Themen 3
A unterschiedliche Schreibweisen Java Basics - Anfänger-Themen 19
ARadauer String.split -> unterschiedliche längen Java Basics - Anfänger-Themen 2
B Primzahlen berechnen - Wieso unterschiedliche Java Basics - Anfänger-Themen 3
P Servlet unterschiedliche Server Java Basics - Anfänger-Themen 2
T Unterschiedliche Werte beim FileInputStream Lesen Java Basics - Anfänger-Themen 2
G Unterschiedliche Arten jars einzubinden in Eclipse. Warum? Java Basics - Anfänger-Themen 4
A Unterschiedliche Pfade je nach OS? Java Basics - Anfänger-Themen 4
O Unterschiedliche Masken Java Basics - Anfänger-Themen 7
V funktionen/Variablen f. unterschiedliche Klassen definierne? Java Basics - Anfänger-Themen 6
M unterschiedliche arten von methoden Java Basics - Anfänger-Themen 4
S Mit line.split() leider unterschiedliche Anzahl von Spalten Java Basics - Anfänger-Themen 19
K Exception nur im "Debug"-Modus und jedem 3.-5. mal Ausführen Java Basics - Anfänger-Themen 3
Q Eclipse Debug Mode Java Basics - Anfänger-Themen 2
O Debug-Funktion mit Slick - Kleines Problem Java Basics - Anfänger-Themen 5
J Probleme mit Debug Java Basics - Anfänger-Themen 3
D Debug Current Instruction Pointer Fehler Java Basics - Anfänger-Themen 8
J Tipp: Informativere Debug-Meldungen ausgeben Java Basics - Anfänger-Themen 4
J Run und Debug eines Java-Projektes Java Basics - Anfänger-Themen 41
P Debug- Modus Java Basics - Anfänger-Themen 3
G If Debug in JAVA? Java Basics - Anfänger-Themen 11
G Eclipse debug JVM_Bind Java Basics - Anfänger-Themen 6
F [Hibernate] Debug INFO Einstellungen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben