String[] result = str(args);
ah genau, du hast Recht 😅Man kann auf Parameter oder lokale Variablen von anderen Methoden nicht zugreifen.
Diese Parameter oder Variablen existieren nur zum Zeitpunkt des Methodenaufrufes und auch nur innerhalb der Methode selbst.
Was genau willst du denn überhaupt da machen?
Die Methode gibt doch sowieso nur den übergebenen Parameter als Rückgabewert zurück.
Und das aktuelle Argument für den Parameter bei deinem Aufruf von str() in main() hast du doch auch.
Nimm doch einfach das.
Doch, Dein Problem ist, dass Du die Methode gar nicht aufrufst, so würde es funktionieren:also wie ich verstanden habe, es ist nicht möglich und auch nicht nötig args mit mainparams gleichzustetzen?
args = mainparams(args);
args = args;
wo siehst du die methode mainparamsdass Du die Methode gar nicht aufrufst
Das Problem mit dem Restalkoholwo siehst du die methode mainparams
okay, ich verstehe dass es überflüssig ist, aber trotzdem möchte ich wissen, warum in args = mainparams(args); wird so was als Ergebnis zurückliefern: [Ljava.lang.String;@123a439bDoch, Dein Problem ist, dass Du die Methode gar nicht aufrufst, so würde es funktionieren:
Java:args = mainparams(args);
Der zweite Punkt ist, dass das (edit: gemeint ist die Zuweisung an args) hier überflüssig ist, weil die Methode einfach das Argument zurückgibt, d. h. der Effekt auf args in main() ist der gleiche wie
Sprich: überflüssig.Java:args = args;
public class MainParams {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("usage: java MainParams <param1> ... <paramN>");
return;
}
for (int i=0; i < args.length; i++)
System.out.print(args[i] + " ");
System.out.println();
}
}
public static void usage(String[] strarr) {
main(new String[] {"abc","def","123","ttt"});
}
Ja, das ist der Sinn von Aufrufparametern.Sinn von all diesem besteht darin, dass args ein Parameter bekommt und damit wird der Rest von dem Code weiterlaufen.
java meinProgramm parameter1 parameter2
Was genau hast Du denn da versucht - das macht so erst einmal wenig Sinn. Zeig am BEsten den ganzen Code, damit man sehen kann was Du genau machst und wo dieses usage z.B. aufgerufen wird.Ich versuchte das zu schreiben:
public class Test {
public static void main(String[] args) {
if (args.length == 0) {
main(new String[] { "a", "b", "c"});
return; // Wichtig - sonst macht er das untere auch noch. Oder statt return den Rest in den else Block packen!
}
for (String arg : args) {
System.out.println(arg);
}
}
}
Ja! Vielen Dank!Ja, das ist der Sinn von Aufrufparametern.
Ich halte es nicht für sinnvoll, main() selbst aufzurufen, dass ist doch auch gar nicht gewünscht. Der Anwender soll informiert werden, dass er etwas falsch gemacht hat und das Programm wird nach dem Hinweis beendet, wenn er es falsch gemacht hat. So wie im ursprünglichen Code gezeigt: Wenn keine Parameter angegeben wurden, dann wird das Programm beendet.
Die Parameter werden beim Start des Programms angegeben und nicht innerhalb des Programms.
Java:java meinProgramm parameter1 parameter2
Falls du mit einer IDE arbeitest und darüber das Programm startest, dann musst du mal gucken. IDEs bieten auch die Möglichkeit Parameter beim Aufruf anzugeben.
War das die Frage?
Vielen Dank für sehr ausführliche Erklärung mit dem Beispiel 😄Was genau hast Du denn da versucht - das macht so erst einmal wenig Sinn. Zeig am BEsten den ganzen Code, damit man sehen kann was Du genau machst und wo dieses usage z.B. aufgerufen wird.
Ein Java Programm startest Du nun einmal von außen. Und da bekommt das Programm dann die Parameter, die von außen angegeben wurden.
Du kannst die Methode natürlich auch von innen aufrufen. Aber da hast Du dann zwei Aufrufe: Einmal den von der Shell (ohne Parameter) und dann ggf. noch den Aufruf mit Parametern.
Also einfach mal ein kleines Beispiel:
Java:public class Test { public static void main(String[] args) { if (args.length == 0) { main(new String[] { "a", "b", "c"}); return; // Wichtig - sonst macht er das untere auch noch. Oder statt return den Rest in den else Block packen! } for (String arg : args) { System.out.println(arg); } } }
Ein Aufruf ohne Parameter würde dann die Methode noch einmal mit parametern aufrufen. Aber statt dem rekursiven Aufruf kannst Du auch einfach die Werte neu setzen, also ein args = new ......
Da hierauf noch nicht eingegangen wurde: das "[Ljava.lang.String;@123a439b" ist einfach das Ergebnis der toString-Methode, die in java.lang.Object definiert ist. Konkret liefert die Methodewird so was als Ergebnis zurückliefern: [Ljava.lang.String;@123a439b
Kann ich args vollkommen gleich mit mainparams machen?
getClass().getName() + '@' + Integer.toHexString(hashCode())
zurück.[Ljava.lang.String;
) und"" + args
wird daraus ein "" + String.valueOf(args)
, wobei String.valueOf prüft, ob args == null
gilt. In dem Fall wird der String "null"
als Ergebnis zurückgegeben, ansonsten das Ergebnis von args.toString()
.args = x
wird also die Adresse, die in Variable x gespeichert ist, der Variablen args zugewiesen, so dass diese "vollkommen gleich" sind. Nach der Zuweisung gilt args == x
. In dem Fall verweisen args und x nicht nur auf inhaltsgleiche Objekte, sondern tatsächlich auf ein und dasselbe Objekt. String[] args = {"A", "B", "C"};
String[] other = args;
System.out.println(java.util.Arrays.toString(args));
System.out.println(java.util.Arrays.toString(other));
other[1] = "X";
System.out.println(java.util.Arrays.toString(args));
System.out.println(java.util.Arrays.toString(other));
[A, B, C]
[A, B, C]
[A, X, C]
[A, X, C]
danke für Erklärung! Sorry für spätere Antwort[A, X, C]
[A, X, C]
args = new String[] {"A", "B", "C"};
String[] other = new String[args.length] ;
for(int abc =0; abc<args.length;abc++) {
other[abc] = args[abc];
}
System.out.println(java.util.Arrays.toString(args));
System.out.println(java.util.Arrays.toString(other));
other[1] = "X";
System.out.println(java.util.Arrays.toString(args));
System.out.println(java.util.Arrays.toString(other));
[A, B, C]
[A, B, C]
[A, B, C]
[A, X, C]
Bei Deiner Lösung ist es möglich. Bei der Lösung von @mihe7 ist dies nicht möglich. Das ist auch einfach zu erklären:Bezüglich deiner Ausgabe - kann ich die Elemente von String[] other ändern, ohne die Elemente von String[] args zu ändern?
klar, Dankeschön!Bei Deiner Lösung ist es möglich. Bei der Lösung von @mihe7 ist dies nicht möglich. Das ist auch einfach zu erklären:
Bei der ersten Lösung von @mihe7 wurde die Referenz auf das Array args in die Variable other kopiert. Dadurch haben beide Variablen eine Referenz auf nur ein Array gehabt. Wenn dieses eine Array geändert wurde, dann sah man dies über beide Variablen.
Du hast aber ein neues Array mit der gleichen Größe erstellt und dann nur den Inhalt kopiert. Dadurch hast Du zwei unterschiedliche Arrays und wenn Du ein Array änderst, dann ändert sich nicht das zweite.
es hat wirklich nichts mit Aufrufparametern zu tun, ich hatte einfach noch zusätzliche Fragen bezüglich der Antworten auf meine allererste FrageWas ist denn eigentlich dein Ziel?
Versteh grad nicht, was die letzten Beiträge mit Aufrufparametern zu tun haben.