Java Probleme mit Kompilieren :(

F

Furtano

Gast
Habe das Programm mit

Code:
javac *.java

übersetzt.
Klassen-Dateien und Quelldateien befinden sich im selben Ordner.

Gab keine Fehler. Wenn ich es jetzt mit

Code:
java -cp htw.beleg Beleg

starten möchte bekomme ich die Fehlermeldung:

Code:
Fehler: Hauptklasse Beleg konnte nicht gefunden oder geladen werden





Folgendes funktioniert auch nicht:
Code:
C:\Users\chris\Desktop\uni\prog3\beleg\src>java -cp htw Beleg
Exception in thread "main" java.lang.NoClassDefFoundError: Beleg (wrong name: ht
w/Beleg)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

Hauptklasse
PHP:
package htw;

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.File;

/**
 * Hauptklasse zum:
 * - Anzeigen von Bildern
 * - Histogrammen berechnen und anzeigen
 * - Farbauszuege berechnen und anzeigen
 */

public class Beleg {

	/**
	 * Konfiguriert das Fenster
	 * @param args Kommandozeilenargumente
	 */
	public static void main(String[] args) {
			if (args.length == 0){
				System.err.println("Kein Bild uebergeben!");
			}
			else if (args.length == 1){
				boolean exists = (new File(args[0])).exists();
				
				//Existiert die Datei auf der Festplatte?
				if (exists) {
					//Nur JPG-Dateien sollen geoeffnet werden
					//Ueberpruefung anhand der Dateiendung
					if (args[0].endsWith("jpg") || args[0].endsWith("jpeg")) {
						ImageToolK pct1 = new ImageToolK(args[0]);
					    Image foto1 = pct1.getImage();
					     
						Window fenster_main_1 = new Window(args[0], foto1);
						
						String filename = new File(args[0]).getName();
						fenster_main_1.setTitle(filename);				
						
						// Aktuelle Bildschirmaufloesung
						Dimension dim = ImageToolK.getActualScreenSize();

						Integer actualXSize = 0;
						Integer actualYSize = 0;
						
						// Benoetigte Breite
						Integer picNeededSizeX = (pct1.getImageSizeX()+((pct1.getImageSizeX())/2)*3) + fenster_main_1.getInsets().left + fenster_main_1.getInsets().right;
						
						// Benoetigte Hoehe
						Integer picNeededSizeY = (pct1.getImageSizeY() + fenster_main_1.getInsets().top + fenster_main_1.getInsets().bottom);
						
						// Wenn es in der Breite UND der Hoehe groesser als die Bildschirmaufloesung ist
						if (picNeededSizeX > dim.width && picNeededSizeY > dim.height) {
							// Falls in der Breite kleiner skaliert werden muss als in der Hoehe
							if (((double)dim.width / picNeededSizeX) < ((double)dim.height / picNeededSizeY)) {
								actualYSize = (int) (picNeededSizeY * ((double)dim.width / picNeededSizeX));
								fenster_main_1.setSize(dim.width, actualYSize);
							}
							// Falls gleich oder in der Hoehe kleiner skaliert werden muss
							else {
								actualXSize = (int) (picNeededSizeX * ((double)dim.height / picNeededSizeY));
								fenster_main_1.setSize(actualXSize, dim.height);
							}
						}
						
						// Wenn es in der Breite  groesser als die Bildschirmaufloesung ist
						if (picNeededSizeX > dim.width && picNeededSizeY < dim.height) {
							System.out.println(picNeededSizeX);
							actualYSize = (int) (picNeededSizeY * ((double)dim.width / picNeededSizeX));
							System.out.println(actualYSize);
							fenster_main_1.setSize(dim.width, actualYSize);
						}
						
						// Wenn es in der Hoehe groesser als die Bildschirmaufloesung ist
						if (picNeededSizeX < dim.width && picNeededSizeY > dim.height) {
							actualXSize = (int) (picNeededSizeX * ((double)dim.height / picNeededSizeY));
							fenster_main_1.setSize(actualXSize, dim.height);
						}
						
						// Wenn es weder in der Breite noch in der Hoehe groesser als die Bildschirmaufloesung ist
						if (picNeededSizeX < dim.width && picNeededSizeY < dim.height) {
							fenster_main_1.setSize(picNeededSizeX, picNeededSizeY);
						}
						fenster_main_1.addWindowListener(new CloseAdapter());
						fenster_main_1.setVisible(true);
					}
					else {
						System.err.println("Dateiendung nicht .jpg oder .jpeg -> Waehlen Sie eine JPG-Datei aus!");
					}
				}
				else {
					System.err.println("Diese Datei existiert nicht: " + args[0]);
				}
				
			}
			else {
				System.err.println("Zu viele Bilder uebergeben!");
			}			
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Code:
C:\Users\chris\Desktop\uni\prog3\beleg\src\htw>java Beleg
Exception in thread "main" java.lang.NoClassDefFoundError: Beleg (wrong name: ht
w/Beleg)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

C:\Users\chris\Desktop\uni\prog3\beleg\src\htw>
 
Doch, beim compilieren kommen keine Fehler und die Anzahl der .java Datein == Anzahl der .class Dateien.
 
Warum benutzt du nicht einfach eine IDE statt dich mit sowas aufzuhalten? Zu erlernen wie das "händisch" geht, ist ja offensichtlich nicht dein Ziel, oder?

Und nein, ich habe keine Lust mich darüber zu streiten, ob man auch in der Lage sein sollte das per CLI zu kompilieren und auszuführen.

Übrigens finde ich den Code gruselig, nimm es nicht persönlich.


Edit: Okay, wenn du das für eine Klausur können musst, dann habe ich nichts gesagt. :P
 
Zuletzt bearbeitet:
liegt am Package...
die Klasse wird identifiziert durch htw.Beleg
also musst du erst ins übergeordnete Verzeichnis und
java htw.Beleg
machen
 
@Tumbleweed

Ich habe Eclipse für das ganze benutzt.
Nur muss ich das manuelle kompilieren auch können für die Klausur demnächst!
Außerdem sollte es doch eigentlich gehen.

Und was meinst du genau mit gruselig?
Wenn du die if-Abfragen für die Größe meinst, die sind von meinem Partner :)

@1668mib

Hey DANKE das wars :):):)
 
Zuletzt bearbeitet von einem Moderator:
Vor allem deshalb gruselig weil es (zumindest anscheinend) keine Verkapselung in Methoden gibt, sondern eine Monster-main. Aber okay, damit kann man auch noch leben. Dann sollte man aber zumindest stilistisch diese ewig tiefen if-Verschachtelungen vermeiden, da verliert man ja total den Überblick und es ist absolut nicht nötig das so zu schreiben.
Als Kleinigkeit würde ich noch anmerken, dass ich nicht sehe, warum hier die boxed version von int benutzt wird, aber gut, auch das ist nur eine Kleinigkeit.
 
Wie muss nun der Befehl lauten um eine JAR zu erstellen ?

Code:
jar cvf runnable.jar htw.*
Geht zwar, aber beim Starten der runnable.jar bekomme ich sofort eine Exception

Code:
C:\Users\chris\Desktop\uni\prog3\beleg\src>java -jar runnable.jar htw/lucy1.jpg
Exception in thread "main" java.lang.NullPointerException
        at sun.launcher.LauncherHelper.getMainClassFromJar(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

@Tumbleweed das hilft mir schon mehr weiter als nur das wort gruselig :)
Wie kann man denn die Verschachtelungen vermeiden ?
Ich habe mit C- angefangen und bin dran gewöhnt, wie macht man das in Java besser?
 
Zuletzt bearbeitet von einem Moderator:
Ich habe das mal fix umgeschoben ohne wirklich auf den Inhalt zu achten, aber das sollte so passen und genau das gleiche machen wie dein Code, nur ohne diese tiefen Verschachtelungen. Verkapselung habe ich mir jetzt auch mal gespart.

Code:
    public static void main(String[] args)
    {
        if (args.length == 0)
        {
            System.err.println("Kein Bild uebergeben!");
            return;
        }

        if (args.length > 1)
        {
            System.out.println("Zu viele Parameter übergeben");
            return;
        }

        // Existiert die Datei auf der Festplatte?
        if (!(new File(args[0])).exists())
        {
            System.err.println("Diese Datei existiert nicht: " + args[0]);
            return;
        }

        // Nur JPG-Dateien sollen geoeffnet werden
        // Ueberpruefung anhand der Dateiendung
        if (!(args[0].endsWith("jpg") || args[0].endsWith("jpeg")))
        {
            System.err.println("Dateiendung nicht .jpg oder .jpeg -> Waehlen Sie eine JPG-Datei aus!");
            return;
        }

        ImageToolK pct1 = new ImageToolK(args[0]);
        Image foto1 = pct1.getImage();
        Window fenster_main_1 = new Window(args[0], foto1);
        String filename = new File(args[0]).getName();
        fenster_main_1.setTitle(filename);
        // Aktuelle Bildschirmaufloesung
        Dimension dim = ImageToolK.getActualScreenSize();

        int actualXSize = 0;
        int actualYSize = 0;
        // Benoetigte Breite
        int picNeededSizeX = (pct1.getImageSizeX() + ((pct1.getImageSizeX()) / 2) * 3) + fenster_main_1.getInsets().left
                + fenster_main_1.getInsets().right;
        // Benoetigte Hoehe
        int picNeededSizeY = (pct1.getImageSizeY() + fenster_main_1.getInsets().top + fenster_main_1.getInsets().bottom);
        // Wenn es in der Breite UND der Hoehe groesser als die Bildschirmaufloesung ist
        if (picNeededSizeX > dim.width && picNeededSizeY > dim.height)
        {
            // Falls in der Breite kleiner skaliert werden muss als in der Hoehe
            if (((double) dim.width / picNeededSizeX) < ((double) dim.height / picNeededSizeY))
            {
                actualYSize = (int) (picNeededSizeY * ((double) dim.width / picNeededSizeX));
                fenster_main_1.setSize(dim.width, actualYSize);
            }
            // Falls gleich oder in der Hoehe kleiner skaliert werden muss
            else
            {
                actualXSize = (int) (picNeededSizeX * ((double) dim.height / picNeededSizeY));
                fenster_main_1.setSize(actualXSize, dim.height);
            }
        }
        // Wenn es in der Breite groesser als die Bildschirmaufloesung ist
        if (picNeededSizeX > dim.width && picNeededSizeY < dim.height)
        {
            System.out.println(picNeededSizeX);
            actualYSize = (int) (picNeededSizeY * ((double) dim.width / picNeededSizeX));
            System.out.println(actualYSize);
            fenster_main_1.setSize(dim.width, actualYSize);
        }
        // Wenn es in der Hoehe groesser als die Bildschirmaufloesung ist
        if (picNeededSizeX < dim.width && picNeededSizeY > dim.height)
        {
            actualXSize = (int) (picNeededSizeX * ((double) dim.height / picNeededSizeY));
            fenster_main_1.setSize(actualXSize, dim.height);
        }
        // Wenn es weder in der Breite noch in der Hoehe groesser als die Bildschirmaufloesung ist
        if (picNeededSizeX < dim.width && picNeededSizeY < dim.height)
        {
            fenster_main_1.setSize(picNeededSizeX, picNeededSizeY);
        }
        fenster_main_1.addWindowListener(new CloseAdapter());
        fenster_main_1.setVisible(true);
    }

Die Klammerformatierung einfach ignorieren, das ist Geschmackssache und kommt bei mir durch die Eclipse-Autoformatierung.
 
Naja ne JAR ist erst mal nur nen Archiv. Ohne Informationen dazu, was (= welche Klasse) konkret gestartet werden soll, kann die nicht gestartet werden... Aber man könnte ja auch echt selbst zumindest ein klein wenig selbst Recherchieren... AFAIK muss die in einer Manifest-Datei angegeben werden, aber ich baue meine Jars nciht so...

Zum Stil: Klar ist der grausam. In C würdest du mehr Funktionen schreiben, in Java halt Methoden...
Und manchmal ist es eleganter zu prüfen ob was falsch ist, dann kurz nen Fehler zeigen, und einfach rausspringen.. so kann man schnell Verschachtelungstiefe einsparen...
 
Zurück
Oben