Komandozeilenargument

mattrock

Mitglied
Hi,
ich soll ein Programm schreiben welches drei ganzzahlige Kommandozeilenargumente entgegen nimmt und mir dann den max. Wert ausgibt. Zudem soll es soll es mit einen Fehler melden wenn ich weniger als 3 oder mehr wie 3 Zahlen eintippe und wenn ich statt Zahlen einen text eintippe.
Beispiel: ich gebe 1 7 ein und ich bekomme als Antwort: Bitte 3 Zahlen eingeben.

Also das mit dem Maximum habe ich schon hin bekommen.
Hier mal der Code:

Java:
import java.io.*;
import java.util.*;

public final class Kommandozeile{ 

    private static int max(int a, int b) { 
        return a > b ? a : b;
    }
    public static void main( String[] args ) { 
        if (args.length == 0) {
            System.out.println("Bitte 3 Parameter angeben ..."); 
            System.exit(1); // Programmabbruch mit Fehler
        }
        int m = Integer.parseInt(args[0]); 
        for (int i = 1; i < args.length; i++) {
            int n = Integer.parseInt(args[i]);
            m = max(m, n);
        
        }
        System.out.println(m);
    }
}

Jedoch wie bekomme ich das mit den Fehlern hin???
 
G

Gast2

Gast
Java:
If (args.length < 3) { ... Fehlermeldung und beenden ...}
If (args.length > 3) { ... Fehlermeldung und beenden ...}
Oder was genau meinst du?
 

mattrock

Mitglied
Ja ich glaube.
Wie muss das denn genau aussehen. Wo genau muss ich diese if Anweisung in meinen Quelltext denn einbauen.
Wie schaffe ich es das es zwischen Zahl und Text unterscheiden kann.
 
G

Gast2

Gast
Die Anweisungen kommen da hin wo die andere Anweisung auch steht die die länge des Arrays prüft ;)
Wie schaffe ich es das es zwischen Zahl und Text unterscheiden kann.
Entweder indem du jede Zahl mit einem Regex prüfst (ist bei ganzzahlen recht einfach) oder mit Integer.parseInt probiert die Zahl zu parsen, bei ner Exception wars dann keine zahl.
 
G

Gast2

Gast
so z.b.:
Java:
		String pattern = "0|[[1-9]+\\d*]";
		System.out.println("123".matches(pattern));
		System.out.println("0123".matches(pattern));
		System.out.println("2e10".matches(pattern));
		System.out.println("ZAHL".matches(pattern));
 

mattrock

Mitglied
Also in meinen Skript haben wir diese Regex Geschichte noch nicht durch genommen.

Habe versucht dies dann auch mit der args.length zu vergleich. Aber das ist mist. Habe ehrlich von nichts mit Regex gemacht.
 
G

Gast2

Gast
Dann lass die Regex Geschichte weg und prüfs mit Integer.parseInt. Das habter ja wohl schon gehabt :)
 

mattrock

Mitglied
jo haben wir.

aber wie funktioniert das mit regex. ist es so schwer??
Was muss ich genau machen damit ich überprüfen kann ob die Eingabe richtig ist. Ich habe da schon was gelesen wegen patch und match und man vorher definieren kann ob nur zahlen, buchstaben usw. eingelesen werden
 

XHelp

Top Contributor
Ich denke mal es wäre "einfacher" nur eine Schleife über alle Zeichen laufen zu lassen:
Java:
for (int i = 0; i < args.length; i++) {
	boolean isInteger = args[i].length()>0;
	for (int j=0;j<args[i].length();j++) {
		if (!Character.isDigit(args[i].charAt(j))) {
			isInteger = false;
		}
	}
	System.out.println(args[i]+", Zahl? - "+isInteger);
}
 
Zuletzt bearbeitet:
G

Gast2

Gast
aber wie funktioniert das mit regex. ist es so schwer??
Was muss ich genau machen damit ich überprüfen kann ob die Eingabe richtig ist. Ich habe da schon was gelesen wegen patch und match und man vorher definieren kann ob nur zahlen, buchstaben usw. eingelesen werden
Ich hab dir doch ein paar Beispiele gegeben, mehr Magie gibts da nicht, wo hast du Probleme das einzubauen bei dir?
 

mattrock

Mitglied
Ich tue mir gerade sehr schwer dabei.
Habe ja meine zwei if Anweisungen mit den ich überprüfe ob es weniger oder mehr als 3 Zahlen sind. Das ist ja auch alles ganz klar und verständlich.
Nun möchte ich ja wenn ich z.B. 3 7 blödsinn eingeben, dass Programm mir sagt das dies eine ungültige Eingabe ist.

Ich probiere mal irgendwie weiter.
 
G

Gast2

Gast
So z.b.:
Java:
	public static void main(String[] args) {
		String pattern = "0|[[1-9]+\\d*]";
		// Deine Abfragen ob die Länge der Parameter passt
		
		boolean isValid = true;
		for (String arg : args) {
			isValid &= arg.matches(pattern); 
		}
		
		System.out.println(isValid);
	}
 

mattrock

Mitglied
Also vielen Dank für eure Hilfe.
Aber irgendwie ist da immer noch der Wurm drin. Jetzt macht das Programm kein Maximum mehr. Vielleicht habe ich heute auch schon zu lange an anderen Programmen gesessen.

Hier mal der Code den ich bis jetzt habe:

Java:
 import java.io.*;
import java.util.*;



public final class Kommandozeile{ 

    private static int max(int a, int b) { 
        return a > b ? a : b;
    }
    public static void main( String[] args) { 
        String pattern = "0|[[1-9]+\\d*]";
        if (args.length < 3) {
            System.out.println("Bitte genau 3 Parameter angeben"); 
            System.exit(1); // Programmabbruch mit Fehler
        }
        if (args.length > 3) {
            System.out.println("Bitte genau 3 Parameter angeben"); 
            System.exit(1); // Programmabbruch mit Fehler
        }
        boolean isValid = true;
        for (String arg : args) {
            isValid &= arg.matches(pattern); 
        
        
        System.out.println("Die Eingabe ist " + isValid );
        System.exit(1);
    }
 
        int m = Integer.parseInt(args[0]); 
        for (int i = 1; i < args.length; i++) {
            int n = Integer.parseInt(args[i]);
            m = max(m, n);
        
        }
        System.out.println("Maximum: " + m);
    }
}
 
G

Gast2

Gast
Java:
        boolean isValid = true;
        for (String arg : args) {
            isValid &= arg.matches(pattern); 
        
        
        System.out.println("Die Eingabe ist " + isValid );
        System.exit(1);
    }
Du beendest in der Schleife ja auch direkt dein Programm. Du musst NACH der Schleife abfragen ob isValud true oder false ist und entsprechend dein programm dann beenden.
 

preachie

Aktives Mitglied
Außerdem, wenn Du den Fall dass weniger als 3 Parameter übergeben werden gleich behandelst mit dem Fall wenn mehr als 3 Parameter übergeben werden, kannst Du die Abfrage auch zusammenfassen.

Statt

Java:
        if (args.length < 3) {
            System.out.println("Bitte genau 3 Parameter angeben"); 
            System.exit(1); // Programmabbruch mit Fehler
        }
        if (args.length > 3) {
            System.out.println("Bitte genau 3 Parameter angeben"); 
            System.exit(1); // Programmabbruch mit Fehler
        }

verwendest Du dann

Java:
        if (args.length < 3 || args.length > 3) {
            System.out.println("Bitte genau 3 Parameter angeben"); 
            System.exit(1); // Programmabbruch mit Fehler
        }

Edit:

Oder natürlich auch einfach:

Java:
        if (args.length != 3) {
            System.out.println("Bitte genau 3 Parameter angeben"); 
            System.exit(1); // Programmabbruch mit Fehler
        }

;)
 

mattrock

Mitglied
Klar. Vielen Dank.

Es ist ja eigentlich alles total einfach. Echt klasse das einem hier so geholfen wird. Macht echt Spaß hier.
Aber ich merke das ich noch mehr Praxis in Java benötige.
 

Neue Themen


Oben