Co to jest „String args []”? parametr w głównej metodzie Java

315

Zaczynam pisać programy w Javie. Co oznacza następujący kod Java?

public static void main(String[] args)
  • Co to jest String[] args?

  • Kiedy ich użyjesz args?

Kod źródłowy i / lub przykłady są lepsze niż abstrakcyjne wyjaśnienia

freddiefujiwara
źródło

Odpowiedzi:

302

W Javie argszawiera dostarczone argumenty wiersza polecenia jako tablicę Stringobiektów.

Innymi słowy, jeśli uruchomisz swój program, java MyProgram one twowówczas argsbędzie on zawierać ["one", "two"].

Jeśli chcesz wypisać zawartość args, możesz po prostu przejść przez nie w ten sposób ...

public class ArgumentExample {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}
Dan Lew
źródło
51
Warto zauważyć, że argsniekoniecznie musi być nazwane args(możesz nazwać to, co chcesz) - chociaż najlepiej postępować zgodnie z konwencją. String... argsOd czasu do czasu możesz także zobaczyć , co jest równoważne.
vikingsteve
68
indeksowanie argumentów zaczyna się od 0. (w przeciwieństwie do C, podając nazwę programu)
AdrieanKhisbe
1
@Daniel, Czy argsgwarantowane jest oddzielenie spacją niezależnie od systemu operacyjnego?
Pacerier
@Pacerier przepraszam, jestem bardzo spóźniony i nie mam źródła, ale mocno wierzę, że tak. Wydaje mi się, że java (.exe) obsługuje argumenty, a nie bazową powłokę / terminal. Weźmy -versionna przykład to java -versioni java.exe -version, ale nie java.exe /version(próby załadowania klasy głównej .version). Tylko moje 2 centy, jeśli ktoś kiedykolwiek się na to natknie.
Łukasz
1
@Luke To nie może być prawda, przynajmniej nie w systemach Unix. Tam powłoka przekazuje argumenty do programu, który jest już podzielony zgodnie z regułami powłoki (odpowiednio usuwając cudzysłowy / znaki ucieczki). Nie ma możliwości, aby program (w tym przypadku interpreter języka Java) uzyskał dostęp do oryginalnej nieoznaczonej linii poleceń, ani też nie powinien tego robić, ponieważ wprowadziłby użytkownika w błąd.
regnarg,
112

Są to argumenty wiersza poleceń w Javie.

Innymi słowy, jeśli biegniesz

java MyProgram one two two

Następnie argszawiera:

[ "jeden dwa" ]

public static void main(String [] args) {
    String one = args[0]; //=="one"
    String two = args[1]; //=="two"
}

Powodem tego jest skonfigurowanie aplikacji do działania w określony sposób lub dostarczenie potrzebnych informacji.


Jeśli dopiero zaczynasz korzystać z Javy, zdecydowanie polecam przeczytanie oficjalnych samouczków Java TM firmy Oracle .

mR_fr0g
źródło
45

argszawiera argumenty wiersza polecenia przekazywane do programu Java po wywołaniu. Na przykład, jeśli wywołam program w ten sposób:

$ java MyProg -f file.txt

Wtedy argsbędzie tablica zawierająca ciągi "-f"i "file.txt".

mipadi
źródło
Dziękuję za odpowiedź.
Chaklader Asfak Arefe
Musiałem najpierw skompilować kod za pomocą, javac MyProg.javaa następnie uruchomić java MyProg -f file.txt. Czy jest ku temu powód, ponieważ nigdzie nie wspomniano w odpowiedziach?
stanimirsp
@stanimirsp: Najpierw musisz skompilować kod źródłowy Java do .classpliku.
mipadi
19

Poniższa odpowiedź jest oparta na moim zrozumieniu i pewnym teście.

Co to są argumenty String []?

Ans->

String [] -> Jak wiemy, jest to prosta tablica String.

args -> to nazwa tablicy może być dowolna (np. a, ar, argument, parametr, parametr) bez problemów z kompilatorem i uruchomionym, a także przetestowałem.

Np.
1) public static void main (String [] argument)

2) public static void main (parametr String [])

Kiedy użyjesz tych argumentów?

Ans->

Główna funkcja została zaprojektowana bardzo inteligentnie przez programistów. Rzeczywiste myślenie jest bardzo głębokie. Który jest zasadniczo opracowany z uwzględnieniem C & C ++ na podstawie argumentu wiersza poleceń, ale obecnie nikt go nie używa.

Rzecz 1 - Użytkownik może wprowadzić dowolny typ danych z wiersza polecenia może być Liczba lub Ciąg i niezbędne do zaakceptowania go przez kompilator, jakiego typu danych powinniśmy użyć? zobacz rzecz 2

Thing 2- String to typ danych, który obsługuje wszystkie pierwotne typy danych, takie jak int, long, float, double, byte, shot, char w Java. Możesz go łatwo przeanalizować w dowolnym prymitywnym typie danych.

Np . Następujący program jest skompilowany i uruchomiony, a ja również przetestowałem.

Jeśli dane wejściowe to -> 1 1

// one class needs to have a main() method
public class HelloWorld
{
  // arguments are passed using the text field below this editor
  public static void main(String[] parameter)
  {    
System.out.println(parameter[0] + parameter[1]); // Output is 11

//Comment out below code in case of String
    System.out.println(Integer.parseInt(parameter[0]) + Integer.parseInt(parameter[1])); //Output is 2
    System.out.println(Float.parseFloat(parameter[0]) + Float.parseFloat(parameter[1])); //Output is 2.0    
    System.out.println(Long.parseLong(parameter[0]) + Long.parseLong(parameter[1])); //Output is 2    
    System.out.println(Double.parseDouble(parameter[0]) + Double.parseDouble(parameter[1])); //Output is 2.0    

  }
}
Ajinkya
źródło
13

Nawet jeśli OP mówi tylko o String[] args, chcę dać pełny przykład public static void main(String[] args).

Public: jest modyfikatorem dostępu , który określa, kto może uzyskać dostęp do tej metody. Publiczny oznacza, że ​​ta metoda będzie dostępna dla dowolnej klasy (jeśli inne klasy będą mogły uzyskać dostęp do tej klasy).

Static: to słowo kluczowe, które identyfikuje rzecz związaną z klasą. Oznacza to, że dana metoda lub zmienna nie jest związana z instancją, ale z klasą. Można uzyskać do niego dostęp bez tworzenia instancji klasy.

Void: służy do zdefiniowania typu zwrotu metody. Określa, co metoda może zwrócić. Void oznacza, że ​​Metoda nie zwróci żadnej wartości.

main: to nazwa metody. Ta nazwa metody jest przeszukiwana przez JVM jako punkt początkowy dla aplikacji z konkretną sygnaturą.

String[] args : jest parametrem głównej metody.

Jeśli zajrzysz do kodu źródłowego JDK (jdk-src \ j2se \ src \ share \ bin \ java.c):

/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                   "([Ljava/lang/String;)V");
...
{    /* Make sure the main method is public */
...
mods = (*env)->CallIntMethod(env, obj, mid);
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
    message = "Main method not public.";
    messageDest = JNI_TRUE;
    goto leave;
...

Widać, że metoda początkowa w Javie musi mieć nazwę maini musi mieć określony podpispublic static void main(String[] args)

Kod mówi nam również, że public static void main(String[] args)nie został naprawiony, jeśli zmienisz kod w (jdk-src \ j2se \ src \ share \ bin \ java.c) na inny podpis, będzie działał, ale jego zmiana spowoduje inne możliwe problemy z powodu specyfikacji Java

Offtopic: Minęło 7 lat, odkąd OP zadał to pytanie, domyślam się, że OP może teraz odpowiedzieć na swoje własne pytanie.

Igoranze
źródło
12

String [] args jest także sposobem deklarowania tablicy napisów w Javie.

W sygnaturze tej metody tablica argsbędzie wypełniona wartościami po wywołaniu metody (jak pokazują inne przykłady tutaj). Ponieważ się uczysz, warto zrozumieć, że ta argstablica jest taka, jakbyś sam ją stworzył w metodzie, jak w tym:

public void foo() {
    String [] args = new String[2];
    args[0] = "hello";
    args[1] = "every";

    System.out.println("Output: " + args[0] + args[1]);

    // etc... the usage of 'args' here and in the main method is identical
}
Cuga
źródło
12

Rozpadłbym się

public static void main(String args[])

w częściach.

„public” oznacza, że ​​main () można wywołać z dowolnego miejsca.

„statyczny” oznacza, że ​​main () nie należy do określonego obiektu

„void” oznacza, że ​​main () nie zwraca żadnej wartości

„main” to nazwa funkcji. main () jest wyjątkowy, ponieważ jest początkiem programu.

„Ciąg []” oznacza tablicę Ciąg.

„args” to nazwa ciągu [] (w treści main ()). „args” nie jest wyjątkowy; możesz to nazwać cokolwiek innego, a program będzie działał tak samo.

  • String[] argsjest zbiorem ciągów znaków, oddzielonych spacją, które można wpisać w programie na terminalu. Więcej niż nie, początkujący nie będzie używał tej zmiennej, ale zawsze jest na wszelki wypadek.
Jaimin Patel
źródło
9

Po zakończeniu kodu zamienisz go w plik z rozszerzeniem .java, który można uruchomić, klikając go dwukrotnie, ale także w konsoli (terminal na komputerze Mac, cmd.exe w systemie Windows), co pozwala użytkownikowi to zrobić wiele rzeczy. Jedną rzeczą jest to, że widzą komunikaty konsoli (System.out.print lub System.out.println), których nie widzą po dwukrotnym kliknięciu. Inną rzeczą, jaką mogą zrobić, jest określenie parametrów, więc normalnie użyłbyś linii

java -jar MyCode.jar

po przejściu do folderu programu za pomocą

cd C:My/Code/Location

w systemie Windows lub

cd My/Code/Location

na Macu (zauważ, że Mac jest mniej niezręczny), aby uruchomić kod, ale aby określić parametry, których chcesz użyć

java -jar MyCode.jar parameter1 parameter2

Te parametry przechowywane w tablicy args, których można użyć w programie, pozwalają użytkownikowi kontrolować parametry specjalne, takie jak używany plik lub ilość pamięci, jaką program może mieć. Jeśli chcesz wiedzieć, jak korzystać z tablicy, prawdopodobnie możesz znaleźć temat na tej stronie lub po prostu google. Pamiętaj, że można użyć dowolnej liczby parametrów.

Zac
źródło
9

Wyjaśnienie w prostym języku laika.

Główna metoda oczekuje od nas podania pewnych argumentów, gdy kierujemy naszą maszynę JVM do nazwy klasy. Oznacza to, że załóżmy, że twoja nazwa pliku to Try.java, teraz aby wykonać to w wierszu polecenia, napisz „javac Try.java” do skompilowania, a następnie „java Try” do wykonania. Załóżmy teraz, że zamiast pisać po prostu „java Spróbuj” piszesz „java Spróbuj 1”. Podałeś tutaj argument „1”. Zostanie to zrobione przez twoją główną metodę, nawet jeśli nie użyjesz jej w kodzie.

Jeśli chcesz sprawdzić, czy Twoja główna metoda rzeczywiście wzięła argument „1”, czy nie. Po prostu w głównej metodzie wpisz:

for(int i = 0; i < args.length; i++) {
        System.out.println("Argument is: "+args[i]);
    }
Jatin Lalwani
źródło
7

Myślę, że jest dość dobrze uwzględniony w powyższych odpowiedziach, które String args[]są po prostu tablicą argumentów łańcuchowych, które można przekazać aplikacji podczas jej uruchamiania. Na zakończenie mogę dodać, że poprawne jest również zdefiniowanie parametru metody przekazywanego do mainmetody jako argument zmiennej (varargs) typu String:

public static void main (String... args)

Innymi słowy, mainmetoda musi zaakceptować tablicę String ( String args[]) lub varargs ( String... args) jako argument metody. Nie ma też magii z tym imieniem args. Równie dobrze możesz pisać, argumentsa nawet freddiefujiwarajak pokazano poniżej, np .:

public static void main (String[] arguments)

public static void main (String[] freddiefujiwara)

sedeh
źródło
6

Kiedy klasa Java jest wykonywana z konsoli, wywoływana jest główna metoda. Aby tak się stało, definicja tej głównej metody musi być następująca

public static void main(String [])

Fakt, że ta tablica ciągów nazywana jest args, jest standardową konwencją, ale nie jest ściśle wymagany. Wypełniasz tę tablicę w wierszu poleceń, gdy wywołujesz swój program

java MyClass a b c

Są one powszechnie używane do definiowania opcji programu, na przykład plików do zapisu lub odczytu.

shsteimer
źródło
6

w public static void main (String args []) args to tablica argumentów linii konsoli, których typ danych to String. w tej tablicy można przechowywać różne argumenty łańcuchowe, wywołując je w wierszu poleceń, jak pokazano poniżej: java myProgram Shaan Royal, a następnie Shaan i Royal będą przechowywane w tablicy jako arg [0] = "Shaan"; arg [1] = „Royal”; możesz to zrobić ręcznie również w programie, gdy nie wywołujesz ich w wierszu poleceń.

Shaan Royal
źródło
3

Styl dataType[] arrayRefVarjest preferowany. Styl dataType arrayRefVar[]pochodzi z języka C / C ++ i został przyjęty w Javie, aby pomieścić programistów C / C ++.

Gerald
źródło
1

Ten String[] argsparametr to tablica ciągów znaków przekazywanych jako parametry podczas uruchamiania aplikacji za pomocą wiersza polecenia w systemie operacyjnym.

Wyobraź sobie, że skompilowałeś i spakowałeś myApp.jaraplikację Java. Możesz oczywiście uruchomić aplikację, klikając ją dwukrotnie w systemie operacyjnym, ale możesz też uruchomić ją za pomocą wiersza poleceń, na przykład (na przykład w systemie Linux):

user@computer:~$ java -jar myApp.jar

Gdy wywołujesz aplikację, przekazując niektóre parametry, takie jak:

user@computer:~$ java -jar myApp.jar update notify

java -jarPolecenia minie struny updatei notifydo swojej public static void main()metody.

Następnie możesz zrobić coś takiego:

System.out.println(args[0]); //Which will print 'update'
System.out.println(args[1]); //Which will print 'notify'
Sir Beethoven
źródło
0

Oprócz wszystkich poprzednich komentarzy.

public static void main(String[] args) 

można zapisać jako

 public static void main(String...arg)

lub

 public static void main(String...strings)
Rahul Anand
źródło