Wie macht man String[] = String[] aus einer anderer Methode?

MoxMorris

Mitglied
Hallo!
Ich hab vergessen, wie man auf Variablen aus einer anderer Methode zugreifen kann? Problem mit args = mainparams;

1672659274382.png
Danke im Voraus!
 

httpdigest

Top Contributor
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.
 
Y

yfons123

Gast
speichere den rückgabe wert in einer variable
Java:
String[] result = str(args);
 

MoxMorris

Mitglied
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.
ah genau, du hast Recht 😅
also wie ich verstanden habe, es ist nicht möglich und auch nicht nötig args mit mainparams gleichzustetzen?
 

mihe7

Top Contributor
also wie ich verstanden habe, es ist nicht möglich und auch nicht nötig args mit mainparams gleichzustetzen?
Doch, 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
Java:
args = args;
Sprich: überflüssig.
 

MoxMorris

Mitglied
Doch, 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
Java:
args = args;
Sprich: überflüssig.
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;@123a439b
Kann ich args vollkommen gleich mit mainparams machen?
Danke im Voraus!
 
Zuletzt bearbeitet:

MoxMorris

Mitglied
Und noch: so sah der ursprüngliche Code.
Java:
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();  
    }
}
Sinn von all diesem besteht darin, dass args ein Parameter bekommt und damit wird der Rest von dem Code weiterlaufen.
1672729220468.png

Ich versuchte das zu schreiben:
Java:
    public static void usage(String[] strarr) {
        main(new String[] {"abc","def","123","ttt"});
    }
aber args hat Länge 0, obwohl in meinem Aufruf 4 Parameter stehen, und daher wird "usage: java MainParams <param1> ... <paramN>" geliefert.
Worin besteht das Problem?
 

temi

Top Contributor
Sinn von all diesem besteht darin, dass args ein Parameter bekommt und damit wird der Rest von dem Code weiterlaufen.
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?
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Ich versuchte das zu schreiben:
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 ......
 

MoxMorris

Mitglied
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?
Ja! Vielen Dank!
 

MoxMorris

Mitglied
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 ......
Vielen Dank für sehr ausführliche Erklärung mit dem Beispiel 😄
 

mihe7

Top Contributor
wird so was als Ergebnis zurückliefern: [Ljava.lang.String;@123a439b
Kann ich args vollkommen gleich mit mainparams machen?
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 Methode getClass().getName() + '@' + Integer.toHexString(hashCode()) zurück.

Dazu muss man wissen, dass
a) in Java die Klasse java.lang.Object der Supertyp aller Objekte ist
b) ein Array in Java ein spezielles Objekt ist (daher auch der "seltsame" Klassenname [Ljava.lang.String;) und
c) die Methode toString() verwendet wird, um ein Objekt implizit in einen String umzuwandeln (z. B. bei String-Konkatenation) bzw. es Methoden wie println(Object) gibt, die toString() explizit aufrufen.

Wenn Du also z. B. schreibst "" + 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().

Zur Frage: die Variablen speichern nur Referenzen auf die Objekte, d. h. die Adresse im Speicher, an der sich das Objekt befindet. Mit der Zuweisung 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.

Beispiel:
Java:
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));

Liefert als Ausgabe
Code:
[A, B, C]
[A, B, C]
[A, X, C]
[A, X, C]

In Zeile 2 wird nicht das Array selbst, sondern nur die Referenz auf das Array kopiert, other und args verweisen somit auf das selbe Array. Daher ist es in Zeile 7 gleich, ob man über other oder über args auf die Elemente zugreift.
 

MoxMorris

Mitglied
[A, X, C]
[A, X, C]
danke für Erklärung! Sorry für spätere Antwort
Bezüglich deiner Ausgabe - kann ich die Elemente von String[] other ändern, ohne die Elemente von String[] args zu ändern?

Hier ist meine Lösung:

Java:
            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));

Ausgabe:
Java:
[A, B, C]
[A, B, C]
[A, B, C]
[A, X, C]


Wenn es noch irgendwie außer meiner Implementation geht, dann würde ich gerne es wissen!
 

KonradN

Super-Moderator
Mitarbeiter
Bezüglich deiner Ausgabe - kann ich die Elemente von String[] other ändern, ohne die Elemente von String[] args zu ändern?
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.
 

temi

Top Contributor
Was ist denn eigentlich dein Ziel?

Versteh grad nicht, was die letzten Beiträge mit Aufrufparametern zu tun haben.
 

MoxMorris

Mitglied
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.
klar, Dankeschön!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Formatierter String macht Probleme Java Basics - Anfänger-Themen 9
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
berserkerdq2 Warum macht man in IJVM am Anfang Bipush 0? Java Basics - Anfänger-Themen 1
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
K Gleitkommazahl macht man 0 punkt matisse oder 1 punkt matisse Java Basics - Anfänger-Themen 2
B Methoden warum macht die Methode nicht das was ich erwarte? Java Basics - Anfänger-Themen 2
E Macht Java Rechenfehler beim Potenzieren und Mod? Java Basics - Anfänger-Themen 5
V Switch Methode macht Code kaputt Java Basics - Anfänger-Themen 18
N Was macht die Klasse? Java Basics - Anfänger-Themen 3
T Was macht diese Zeile? Java Basics - Anfänger-Themen 9
R getUserProperties() macht für mich keinen Sinn Java Basics - Anfänger-Themen 8
L Was genau macht -> Java Basics - Anfänger-Themen 18
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
U Best Practice Fehleranalyse, welche Fehler macht Ihr beim Lernen bzw. auch später Java Basics - Anfänger-Themen 12
L Hilfe! Was macht dieser Code? Java Basics - Anfänger-Themen 1
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
M Was macht super (...)? Java Basics - Anfänger-Themen 1
Tommy135 Klassen jComboBox macht nicht was sie soll Java Basics - Anfänger-Themen 4
J JButton macht was er will Java Basics - Anfänger-Themen 3
R While-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 24
JavaNewbie2.0 Habe ein frage wie man etwas macht. Java Basics - Anfänger-Themen 13
B Was macht diese Methode? Java Basics - Anfänger-Themen 9
P Was macht diese methode Java Basics - Anfänger-Themen 2
Tacofan Was macht dieses "Stückchen Code"? Java Basics - Anfänger-Themen 3
F JSON null macht mir ein Problem Java Basics - Anfänger-Themen 3
L Was genau macht "public static void" ? Java Basics - Anfänger-Themen 12
C Hilfe - Kleines Programm macht mir Schwierigkeiten Java Basics - Anfänger-Themen 2
G Methoden Was genau macht die Methode light.setInfluencingBounds ? Java Basics - Anfänger-Themen 5
B Erste Schritte Way of life ohne import - Habe Beispiel, macht Unfug Java Basics - Anfänger-Themen 21
D Methoden Filewriter macht keine Zeilenumbrüche Java Basics - Anfänger-Themen 3
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
H Tastatur.wurdeGedrueckt() macht nicht das, was ich will :/ Java Basics - Anfänger-Themen 2
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
E Einfache For-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 2
J Shakersort, das Array macht Probleme! Java Basics - Anfänger-Themen 4
A scan.nextLine() - Wenn man zu lange nichts macht, soll etwas passieren Java Basics - Anfänger-Themen 3
C Scrollpanel autoscroll(false) macht nix Java Basics - Anfänger-Themen 2
M StringTokenizer macht Quatsch Java Basics - Anfänger-Themen 21
N Papaklasse macht Zicken mit Parameterkonstruktor Java Basics - Anfänger-Themen 7
K Datentypen double x als Bruch aus Integern macht x zu integer? Java Basics - Anfänger-Themen 3
C Erste Schritte was macht eigentlich "for (;;)" Java Basics - Anfänger-Themen 7
C JDK-Installer macht nichts Java Basics - Anfänger-Themen 11
A JApplet: einbinden von weiteren Jars macht Probleme Java Basics - Anfänger-Themen 2
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
I Für was macht man "deep Kopien" Java Basics - Anfänger-Themen 4
S Erste Schritte While do Schleife - macht nicht was sie soll Java Basics - Anfänger-Themen 7
9 Programm macht nicht was es soll Java Basics - Anfänger-Themen 6
H Was macht diese Methode? Java Basics - Anfänger-Themen 3
S JApplet macht Probleme Java Basics - Anfänger-Themen 2
Y Was macht folgende Regular Expression Java Basics - Anfänger-Themen 2
M Was macht bzw. was bringt ein constructor? Java Basics - Anfänger-Themen 12
P orphaned case macht probs Java Basics - Anfänger-Themen 3
ruutaiokwu System.err.print(ln) macht ein durcheinander??! Java Basics - Anfänger-Themen 8
X Selectionsort macht Probleme Java Basics - Anfänger-Themen 2
P was macht der code? Java Basics - Anfänger-Themen 4
M OOP for Schleife macht mir Probleme mit Arrays Java Basics - Anfänger-Themen 7
R Was macht...? Java Basics - Anfänger-Themen 4
alderwaran closed source jar, kein javadoc. was macht methode x eigentlich? ( oracle forms pjc beans ) Java Basics - Anfänger-Themen 2
M JavaEditor macht Probleme! Invalid Flag! Java Basics - Anfänger-Themen 9
P Was macht dieser Source code? Java Basics - Anfänger-Themen 5
R BufferedWriter macht komische Zeichen Java Basics - Anfänger-Themen 3
I KeyEvent macht nichts.^^ Java Basics - Anfänger-Themen 3
E new File macht den Pfad kaputt Java Basics - Anfänger-Themen 15
S Wie macht man sowas?? Ist da ne If-Schleife richtig?? Java Basics - Anfänger-Themen 22
Pithecanthropus Thread anhalten, der aber ein readObject() macht. Java Basics - Anfänger-Themen 4
T aufruf methode in methode macht probleme Java Basics - Anfänger-Themen 9
I Was macht diese Funktion? Java Basics - Anfänger-Themen 4
0 Was macht eine IOException? Java Basics - Anfänger-Themen 4
0 Was ist ein GregorianCalender?(Was macht es etc.) Java Basics - Anfänger-Themen 2
T Calender / DateFormat macht plus ein Monat Java Basics - Anfänger-Themen 3
T "x hoch y" macht nur "x mal x"^^ Java Basics - Anfänger-Themen 3
M Objektorientierung - wie macht man's richtig? Java Basics - Anfänger-Themen 3
A Macht es Sinn Arraylisten mit Gettern zu übergeben? Java Basics - Anfänger-Themen 19
M JPanel und JTabbedPane macht probleme Java Basics - Anfänger-Themen 5
G JComboBox macht Probleme Java Basics - Anfänger-Themen 7
G Warum das Prog mehrmals das gleiche macht wegen ItemListener Java Basics - Anfänger-Themen 4
S Eclipse macht 2 Fenster auf Java Basics - Anfänger-Themen 4
S was macht super() ? Java Basics - Anfänger-Themen 7
B replaceAll macht nix! :-( Java Basics - Anfänger-Themen 4
V .jar macht keine Datenbank abfragen Java Basics - Anfänger-Themen 3
S Was macht [Integer.toString(number, tarRadix)] Java Basics - Anfänger-Themen 3
T Möchte Charwert 23C° mit java.util.Scanner einlesen macht Pr Java Basics - Anfänger-Themen 2
S wie macht man aus einem int ein double? Java Basics - Anfänger-Themen 2
F Eingabe darf nur 1 oder 0 sein. Meine Lösung macht Probleme. Java Basics - Anfänger-Themen 8
D [DONE] JDK Installation: Compiler macht Probleme. Java Basics - Anfänger-Themen 3
A Was macht dieser Prgrammteil? Java Basics - Anfänger-Themen 2
H Key Listener macht nicht das was er soll Java Basics - Anfänger-Themen 4
G RadioButton in JTable macht Probleme Java Basics - Anfänger-Themen 5
M was macht Syncronized ? Java Basics - Anfänger-Themen 2
G Was bzw. wie macht man das, wenn man jar. datei hat Java Basics - Anfänger-Themen 6
G warum macht er das Java Basics - Anfänger-Themen 4
R BorderLayout macht meine Zeichnung kaputt Java Basics - Anfänger-Themen 14
G Was macht dieses Program ? Java Basics - Anfänger-Themen 13
G Was macht dieser Code? Java Basics - Anfänger-Themen 3
M renderer macht nur 1 spalte bunt Java Basics - Anfänger-Themen 5
U was macht "private" ? :) Java Basics - Anfänger-Themen 7
frau-u guter Stil - wie macht mans am Besten? Java Basics - Anfänger-Themen 8
E JOptionPane macht keine Ausgabe Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben