args-Parameter durchschleifen (Schnittstelle erweitern?)

HoloYoitsu

Aktives Mitglied
Hallo liebe Community, ein Problem das sich leider nicht googlen lässt und dessen Lösung mir fern liegt. Konnte leider auch hier im Forum nichts ähnliches finden.
Mein Vorhaben besteht daraus die Parameter aus der Shell einzulesen und dann im Programm zu verwenden.
(Parameter 1: Dateipfad, Parameter 2: Dateiname)

Klingt einfach, aber...



hier mal die wichtigsten Programmteile:

Java:
	public static void main(String[] args)
	{
		try
		{
			// Calling the method xxx
			KinoBuchungsSystem kbsc = new KinoBuchungsSystem();
			kbsc.hauptSchleife(args);

Java:
	public void hauptSchleife(String[] args)
	{
		KinoBuchungsSystemCore kbsc = new KinoBuchungsSystemCore();

		IConfiguration configloader = new NewConfigurationReaderFromFile(args);
		KinoConfiguration config = configloader.loadKinoKonfiguration();

Java:
public class NewConfigurationReaderFromFile(String[] args) implements IConfiguration
{


	String m_user = System.getProperty("user.name");
	String m_filename = "/" + args[1]; // "KinoConfig.txt";
	String m_path = args[0]; // "C:/Users/" + m_user + "/Documents/" + m_filename;

Und hier die dazugehörige Schnittstelle (muss warscheinlich erweitert werden???)
Java:
public interface IConfiguration()
{

	public static final String ERROR = "Buchungsfehler";
	public static final String PARKETT = "Parkett";
	public static final String RANG = "Rang";
	public static final String LOGE = "Loge";

	public KinoConfiguration loadKinoKonfiguration();

}
 
Zuletzt bearbeitet:
die ganzen Klassen und das Interface scheinen ohne Bedeutung,
die Frage ist allein, ob im args-Array was drinsteht, testweise schon in der main zu untersuchen,

was drinsteht oder fehlt, schreibst du nicht, es ist keine richtige Frage erkennbar,
ein genauer java-Aufruf in Wortlaut wäre auch hilfreich
 
Du meinst auf [c]public KinoConfiguration loadKinoKonfiguration(File file);[/c] erweitert werden? Könnte auch im Konstruktor angegeben werden, tangiert dann die Schnittstelle nicht (muss ja nicht zwingend aus einem File sein).
Warum gibst du den Filenamen und den Pfad überhaupt in zwei unterschiedlichen Argumenten mit?
Irgendwie so geht das super:
Java:
if (args.length < 1) {
    throw new IllegalArgumentException("file path missing");
}
File file = new File(args[0]);
if (!file.exists()) {
    throw new ...();
}
// ...
 
die ganzen Klassen und das Interface scheinen ohne Bedeutung,
die Frage ist allein, ob im args-Array was drinsteht, testweise schon in der main zu untersuchen,

was drinsteht oder fehlt, schreibst du nicht, es ist keine richtige Frage erkennbar,
ein genauer java-Aufruf in Wortlaut wäre auch hilfreich


im args-Array stehen exakt die richtigen Strings, jedoch kann ich dank dutzender Fehlermeldungen nicht mal compilieren. Fehlercode ist auch eher kryptischer Natur. Einzig "relativ" sinnvolle Hilfe ist nur der "- Type mismatch: cannot convert from NewConfigurationReaderFromFile to
IConfiguration" -error in der KinoBuchungsSystem- Methode alles andere wird als Syntax fehler dargestellt.

was drinsteht oder fehlt, schreibst du nicht
Übergebene Parameter stehen als Kommentar hinter der stelle an der sie ausgelesen werden 😉
Nur dass die Membervariable m_user durch die Eingabe ersetzt wird.
Java:
	String m_user = System.getProperty("user.name");
	String m_filename = "/" + args[1]; // "KinoConfig.txt";
	String m_path = args[0]; // "C:/Users/" + m_user + "/Documents/" + m_filename;
 
Zuletzt bearbeitet:
Du meinst auf [c]public KinoConfiguration loadKinoKonfiguration(File file);[/c] erweitert werden? Könnte auch im Konstruktor angegeben werden, tangiert dann die Schnittstelle nicht (muss ja nicht zwingend aus einem File sein).
Warum gibst du den Filenamen und den Pfad überhaupt in zwei unterschiedlichen Argumenten mit?
Irgendwie so geht das super:
Java:
if (args.length < 1) {
    throw new IllegalArgumentException("file path missing");
}
File file = new File(args[0]);
if (!file.exists()) {
    throw new ...();
}
// ...


die zwei Argumente sind quasi "Kundenwunsch" xD
und das mit dem File muss zwingenderweise wegen der Möglichkeit leichter Änderungen für den Anwender sein. Steht von Kinoname bis über Sitzplätze und Reihenanzahlen alles ganz übersichtlich und leicht erweiterbar drin 🙂
 
ijedoch kann ich dank dutzender Fehlermeldungen nicht mal compilieren. Fehlercode ist auch eher kryptischer Natur. Einzig "relativ" sinnvolle Hilfe ist nur der "- Type mismatch: cannot convert from NewConfigurationReaderFromFile to
IConfiguration" -error in der KinoBuchungsSystem- Methode alles andere wird als Syntax fehler dargestellt.
Bei vielen "kryptischen" Fehlern, liegt meistens ein "Grammatikfehler" im Code vor, Klammer, Strichpunkt falsch oder gar nicht gesetzt...
Wenn's zu unübersichtlich wird hilft oft nur "zurück zum Start" bzw. abschnittsweiser Rückbau bis sich der Code wieder komplilieren lässt.
 
programmiere doch nicht so viele Klassen auf einmal, soweit nicht direkte Abhängigkeiten bestehen,
was z.B. ohne Methoden am Anfang immer der Fall ist (*)

> public interface IConfiguration()
hier sind die runden Klammern überflüssig

-> (*) erst
Java:
public interface IConfiguration {
}
erfolgreich kompilieren lassen, dann gehts weiter

------

> public class NewConfigurationReaderFromFile(String[] args) implements IConfiguration

genau wieder runde Klammern weg, Parameter noch mehr,
wenn du einen Konstruktor definieren willst, weißt du hoffentlich was zu tun ist,
der Code danach muss auch in eine Methode oder Konstruktor, nicht direkt in die Klasse

-> (*) erst
Java:
public iclass NewConfigurationReaderFromFile {
}
erfolgreich kompilieren lassen, dann gehts weiter
- implements IConfiguration anfügen, gehts noch?
- String[] args versuchen, totale Fehler? dann gleich überlegen, wozu noch Codezeilen darin
usw.
 
programmiere doch nicht so viele Klassen auf einmal, soweit nicht direkte Abhängigkeiten bestehen,
was z.B. ohne Methoden am Anfang immer der Fall ist (*)
Die einzelnen Klassen sind Seitenlang, sind also nur Abschnitte des Programms 🙂

> public interface IConfiguration()
hier sind die runden Klammern überflüssig

Klammern sind weg xD (kamen noch von Rumprobieren mit Übergabeparametern von grad eben, sry)



> public class NewConfigurationReaderFromFile(String[] args) implements IConfiguration

genau wieder runde Klammern weg, Parameter noch mehr,
wenn du einen Konstruktor definieren willst, weißt du hoffentlich was zu tun ist,
der Code danach muss auch in eine Methode oder Konstruktor, nicht direkt in die Klasse
damit wieder zum alten Problem, wie schleife ich die Argumente dann durch? Müsste doch eigentlich bereits beim Aufruf der Klasse mitgegeben werden, oder?

-> (*) erst
Java:
public iclass NewConfigurationReaderFromFile {
}

Programm ist voll Funktionsfähig und fehlerfrei, es geht lediglich um die Erweiterung durch die Übergabeparameter (die dann in den args stehen)

erfolgreich kompilieren lassen, dann gehts weiter
Befinde mich grad am Punkt "weiter"

- implements IConfiguration anfügen, gehts noch?
- String[] args versuchen, totale Fehler? dann gleich überlegen, wozu noch Codezeilen darin
usw.

Ja, geht gut 🙂
ps.: ich programmiere noch nicht mal seid nem Jahr, und ich denke mal so geht das mit Parametern?

Java:
String[] /*Datentyp deklarieren*/ args /*variablenname*/
- wo ist das problem? Ö.ö
 
Du speicherst dir einfach die Datei, welche im Konstruktor übergeben wird:
Java:
public class NewConfigurationReaderFromFile implements IConfiguration {
    
    private final File file;

    public NewConfigurationReaderFromFile(File file) {
        this.file = file;
    }

    public KinoConfiguration loadKinoKonfiguration() {
        // mach irgendwas mit file...
    }
}
 
wenn du deine Klassen nicht postest sondern nur unbekannte Ausschnitte und auch keine Fehlermeldung,
ist es eben eine Raterei, was dein Problem ist 😉

wie gesagt, in deiner Antwort nicht ganz deutlich geworden ob bekannt,
kannst du (String[] args) nicht in die Klassendefinition schreiben, sondern musst einen Konstruktor schreiben

ich erspare mir Beispiele, entweder bekannt oder nachzuschlagen,

ansonsten: Code, Fehlermeldungen, IRGENDWAS 😉
 
Bei vielen "kryptischen" Fehlern, liegt meistens ein "Grammatikfehler" im Code vor, Klammer, Strichpunkt falsch oder gar nicht gesetzt...
Wenn's zu unübersichtlich wird hilft oft nur "zurück zum Start" bzw. abschnittsweiser Rückbau bis sich der Code wieder komplilieren lässt.

Dummerweise kann ich jeden meiner Schritte rekonstruieren, also an Syntaxfehlern liegts sicher nicht, habe bis jetzt quasi nur die Argumente aus der Main durchgeschleift.
 
An dieser Stelle
Java:
		IConfiguration configloader = new NewConfigurationReaderFromFile(args);

bekomme ich diesen Fehler:

Multiple markers at this line
- The constructor NewConfigurationReaderFromFile(String[]) is undefined
- Type mismatch: cannot convert from NewConfigurationReaderFromFile to
IConfiguration

Ich vermute mal schwer daran könnts liegen, oder?
 
An dieser Stelle
Java:
		IConfiguration configloader = new NewConfigurationReaderFromFile(args);

bekomme ich diesen Fehler:

Multiple markers at this line
- The constructor NewConfigurationReaderFromFile(String[]) is undefined
Welche Konstruktoren bietet denn die Klasse NewConfigurationReaderFromFile? Einen der eine String Array übernehmen kann gibt es wohl nicht. "Gehört" die Klasse Dir, dann kannst Du den Konstruktor ja selbst definieren, wenn nicht musst Du nach anderen Möglichkeiten (Konstruktoren & Methoden) schauen, um die Werte zu übergeben.
 
Vielleicht kann ich euch so noch helfen:

wenn ich die args-parameter aus den Methodensignaturen nehme (sie also nicht mehr durschleife)

und stattdessen einfach diesen ConfigurationReader benutze:

Java:
package de.dic.kino.config;

import de.dic.kino.config.beans.KinoConfiguration;
import de.dic.kino.config.beans.SaalConfiguration;

public class ConfigurationReaderFromFile implements IConfiguration
{

	KinoConfiguration config = new KinoConfiguration();

	/**
	 * LADEN, ERZEUGEN einer KinoKonfiguration
	 * @return 
	 */
	public KinoConfiguration loadKinoKonfiguration()
	{
		/* TODO
		 * 
		 */

		/* Wir erzeugen nur unsere KinoTestKonfiguration, die später von einer anderen 
		 * Klasse aus einer Datei gelesen werden soll. 
		 * 
		 * Hier entseht richtig dumpfer test code !!!!
		 * 
		 */
		/* Erst das Kino Config Objekt */
		KinoConfiguration kinoconfig = new KinoConfiguration();
		kinoconfig.setName("CineMaXX");
		kinoconfig.setSlogan("Die besten Filme aller Zeiten");

		/* Dann die einzelnen Saal Objekte */
		SaalConfiguration saal1 = new SaalConfiguration();
		saal1.setLogeReihen(2);
		saal1.setParkettReihen(2);
		saal1.setRangReihen(2);
		saal1.setSitzeProReihe(6);

		kinoconfig.addSaal(saal1);
		/* 1. Kino fertig */

		SaalConfiguration saal2 = new SaalConfiguration();
		saal2.setLogeReihen(2);
		saal2.setParkettReihen(5);
		saal2.setRangReihen(5);
		saal2.setSitzeProReihe(20);

		kinoconfig.addSaal(saal2);
		/* 2. Kino fertig */

		/* eventuell noch weitere bei mehr sälen */

		return kinoconfig;

	}

	public KinoConfiguration getKinoKonfiguration()
	{
		return config;
	}

}

Funktioniert das Programm ohne Probleme 🙂
 
Welche Konstruktoren bietet denn die Klasse NewConfigurationReaderFromFile? Einen der eine String Array übernehmen kann gibt es wohl nicht. "Gehört" die Klasse Dir, dann kannst Du den Konstruktor ja selbst definieren, wenn nicht musst Du nach anderen Möglichkeiten (Konstruktoren & Methoden) schauen, um die Werte zu übergeben.


Is meine Klasse, kenne mich allerdings nicht besonders mit Konstruktoren aus. Das gute stück sieht bis jetzt so aus:


Java:
package de.dic.kino.config;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import de.dic.kino.config.beans.KinoConfiguration;
import de.dic.kino.config.beans.SaalConfiguration;
import de.dic.test.Helper;

public class NewConfigurationReaderFromFile(String[] args) implements IConfiguration
{

	public final String SAALDELIMITER = "Saal";
	public final String PARAMDELIMITER = ";";
	public final String VALUEDELIMITER = "=";

	public final int PARAMNAME = 0;
	public final int PARAMVALUE = 1;

	String m_user = System.getProperty("user.name");
	String m_filename = "/" + args[1]; // "KinoConfig.txt";
	String m_path = args[0]; // "C:/Users/" + m_user + "/Documents/" + m_filename;

	/**
	 * LADEN, ERZEUGEN einer KinoKonfiguration
	 * 
	 * @return
	 */
	public KinoConfiguration loadKinoKonfiguration()
	{
		try
		{
			String sConfig = this.readTextKonfigurationFile(m_path);
			String[] saConfig = Helper.split(sConfig, SAALDELIMITER);

			if (saConfig == null || saConfig.length < 1)
			{
				return null;
			}
			KinoConfiguration kinoconfig = this.readKinoConfig(saConfig[0]);
			kinoconfig.setNamedValueParameter(KinoConfiguration.CONFIG_PATH, this.m_path);

			for (int i = 1; i < saConfig.length; i++)
			{
				SaalConfiguration saal = this.readSaalConfig(saConfig[i], i);
				if (saal != null)
				{
					kinoconfig.addSaal(saal);
				}
			}
			return kinoconfig;

		}

		catch (FileNotFoundException e)
		{
			System.out.println("File not found!");
			e.printStackTrace();
		}

		catch (IOException e)
		{
			System.out.println("IO Exception");
			e.printStackTrace();
		}
		catch (Exception e)
		{
			System.out.println("File not found!");
			e.printStackTrace();
		}
		/* vorrübergehend bis throws exception implementiert wurde */
		return null;
	}

	/**
	 * Auslesen der in der Zeile gegebenen Daten und speichern der Daten in das KinoConfigurations Objekt
	 * 
	 * @param zeile
	 * @return kinoConfig
	 */
	private KinoConfiguration readKinoConfig(String zeile)
	{
		if (zeile == null || zeile.trim().isEmpty())
		{
			return null;
		}
		System.out.println(zeile);
		KinoConfiguration kinoConfig = new KinoConfiguration();

		// Splitten der zeile mit dem Parameter ";"
		String[] saParameters = Helper.split(zeile, PARAMDELIMITER);

		if (saParameters != null)
		{
			for (int i = 0; i < saParameters.length; i++)
			{
				if (!saParameters[i].trim().isEmpty())
				{
					String[] saValues = Helper.split(saParameters[i], VALUEDELIMITER);

					if (saValues.length >= 2 && !saValues[PARAMNAME].trim().isEmpty() && !saValues[PARAMVALUE].trim().isEmpty())
					{
						kinoConfig.setNamedValueParameter(saValues[PARAMNAME], saValues[PARAMVALUE]);
					}

				}

			}
		}

		return kinoConfig;
	}

	/**
	 * Create a new SaalConfiguration object from Configuration Line
	 * 
	 * @param zeile
	 * @param iSaalNummer
	 * @return saalConfig
	 */
	private SaalConfiguration readSaalConfig(String zeile, int iSaalNummer)
	{
		SaalConfiguration saalConfig = new SaalConfiguration();

		/**/

		if (zeile == null || zeile.trim().isEmpty())
		{
			return null;
		}
		System.out.println(zeile);

		// Splitten der zeile mit dem Parameter ";"
		String[] saParameters = Helper.split(zeile, PARAMDELIMITER);

		if (saParameters != null)
		{
			for (int i = 0; i < saParameters.length; i++)
			{
				if (!saParameters[i].trim().isEmpty())
				{
					String[] saValues = Helper.split(saParameters[i], VALUEDELIMITER);

					if (saValues.length >= 2 && !saValues[PARAMNAME].trim().isEmpty() && !saValues[PARAMVALUE].trim().isEmpty())
					{
						saalConfig.addNamedValueParameter(saValues[PARAMNAME], saValues[PARAMVALUE]);
					}

				}

			}
		}
		/**/

		return saalConfig;

	}

	/**
	 * LADEN einer KinoKonfiguration und abspeichern dieser in einen string
	 * 
	 * @return
	 */
	public String readTextKonfigurationFile(String path) throws Exception
	{
		FileReader fr = new FileReader(path);
		BufferedReader br = new BufferedReader(fr);

		StringBuffer sb = new StringBuffer();

		try
		{
			String sZeile = "";

			while ((sZeile = br.readLine()) != null)
			{
				System.out.println(sZeile);
				sb.append(sZeile.trim());
				sb.append(" ");

			}
			br.close();
			fr.close();
		}

		finally
		{
			if (fr != null)
			{
				fr.close();
				fr = null;
			}

			if (br != null)
			{
				br.close();
				br = null;
			}
		}
		return sb.toString().trim();
	}

}
 
Offenbar gibt es keinen Konstruktor von
Code:
NewConfigurationReaderFromFile
, der einen
Code:
String[]
als Parameter nimmt.

Davon ab sind Membervariablen, die mit m_ beginnen, inzwischen out. *schmunzelt*
Die IDE kann sie dir farblich anders darstellen und ein Variablennamen sollte etwas über die Bedeutung der Variable, nicht aber über ihren Typ oder Speicherort aussagen, da sich beides schon mal eher ändern kann, als die Bedeutung (wenn sich die ändert, sollte man die Variable dann besser umbenennen).
 
Offenbar gibt es keinen Konstruktor von
Code:
NewConfigurationReaderFromFile
, der einen
Code:
String[]
als Parameter nimmt.

Davon ab sind Membervariablen, die mit m_ beginnen, inzwischen out. *schmunzelt*
Die IDE kann sie dir farblich anders darstellen und ein Variablennamen sollte etwas über die Bedeutung der Variable, nicht aber über ihren Typ oder Speicherort aussagen, da sich beides schon mal eher ändern kann, als die Bedeutung (wenn sich die ändert, sollte man die Variable dann besser umbenennen).

Danke für den Tipp, aber während ich noch Lerne bin ich erstmal froh, dass ich sie von normalen Variablen unterscheiden kann :lol:

ps.: ich merk grad ich muss mich definitiv nochmal über Konstruktoren schlau machen, kann mir jemand was empfehlen? hab ansonsten nur das buch Java ist auch eine Insel hier vor mir liegen 😉
 
[JAVA=11]public class NewConfigurationReaderFromFile(String[] args) implements IConfiguration[/code]
Das mit den runden Klammern an falscher Stelle hatten wir doch schon ;-)

Hier wird die Klasse definiert, die Übergabe des String Arrays muss über einen Konstruktor erfolgen:
Java:
...
public class NewConfigurationReaderFromFile implements IConfiguration {

...

    public NewConfigurationReaderFromFile(String[] args) {
        //hier mach etwas mit dem String Array
    }
...
}
 
Danach habe ich auch Java gelernt, allerdings kannte ich objektorientierung vorher schon.

Konstruktoren sind im Grunde genommen verschiedene Möglichkeiten, ein Objekt per
Code:
new
zu erzeugen.

Und wenn die beiden Parameter ein Kundenwunsch sind, musst du sie trotzdem nicht ewig durch das Programm schleifen. An geeigneter Stelle kannst du einfach ein File-Objekt daraus machen und das weiterreichen. Vermutlich ist ein Konstruktor, der ein
Code:
File
entgegennimmt, sprechender als einer, der ein
Code:
String[]
entgegen nimmt.

Mal ein einfaches Beispiel zu Konstruktoren:


Java:
public class Etwas {
    private String sonstwas;

    public Etwas() {
        sonstwas = "";
    }

    public Etwas(String sonstwas) {
        this.sonstwas = sonstwas;
    }

    public Etwas(Object irgendEinDing) {
        this(irgendEinDing.toString());
    }

    public Etwas(Etwas that) {
        this.sonstwas = that.sonstwas;
    }

}
 
Mach daraus
Java:
public class NewConfigurationReaderFromFile(String[] args) implements IConfiguration

mal sowas
Java:
public class NewConfigurationReaderFromFile implements IConfiguration

und der Konstruktor sieht dann so aus
Java:
public NewConfigurationReaderFromFile(String[] args) 
{
//....
}
 
Leute ihr seid SUPER!!! :toll:

Es funktioniert jetzt alles wie es soll, es lag also wirklich nur am Konstruktor 🙂

der neue Code lautet jetzt


Java:
/*imports and stuff*/



public class NewConfigurationReaderFromFile implements IConfiguration 
{
	
	
	public final String SAALDELIMITER = "Saal";
	public final String PARAMDELIMITER = ";";
	public final String VALUEDELIMITER = "=";

	public final int PARAMNAME = 0;
	public final int PARAMVALUE = 1;

	String m_user = System.getProperty("user.name");
	String m_filename; // "KinoConfig.txt";
	String m_path; // "C:/Users/" + m_user + "/Documents/" + m_filename;
	
	
	 public NewConfigurationReaderFromFile(String[] args) 
	 {
	     //zuweisen der Werte aus den Argumenten auf die Membervariablen ;)
		 
		 this.m_filename = "/" + args[1]; // "KinoConfig.txt";
		 this.m_path = args[0]; // "C:/Users/" + m_user + "/Documents/" + m_filename;
		 
		 
		 
		 
	 }
// etc....

Also nochmal, vielen Dank euch :applaus:

Und ich hab mir jetzt ne Raucherpause verdient bevor ich mit den Konstruktoren weiter mach :smoke:
 
Nur noch allgemeine Anmerkungen: Die Kommentare an den Variablen iritieren, das ist vermutlich das, was im Defaultkonstruktor passiert?

Das Userverzeichnis kannst du betriebssystemübergreifend ohne "c:\Users" so erhalten:

Java:
String home = System.getProperty("user.home", ".");

Der Trenner funktioniert zwar auf den mir bekannten Betriebssystemen mit "/", sicherer ist dennoch die Verwendung von
Code:
File.separatorChar
.
 

Zurück
Oben