Chuỗi String args [] là gì? tham số trong phương thức chính Java


315

Tôi mới bắt đầu viết chương trình bằng Java. Mã Java sau có nghĩa là gì?

public static void main(String[] args)
  • String[] args

  • Khi nào bạn sẽ sử dụng chúng args?

Mã nguồn và / hoặc ví dụ được ưa thích hơn các giải thích trừu tượng

Câu trả lời:


302

Trong Java argschứa các đối số dòng lệnh được cung cấp dưới dạng một mảng các Stringđối tượng.

Nói cách khác, nếu bạn chạy chương trình của mình java MyProgram one twothì argssẽ chứa ["one", "two"].

Nếu bạn muốn xuất nội dung của args, bạn có thể lặp qua chúng như thế này ...

public class ArgumentExample {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}

51
Đáng lưu ý là argskhông nhất thiết phải được đặt tên args(bạn có thể đặt tên theo bất cứ điều gì bạn muốn) - mặc dù tốt nhất là tuân theo quy ước. Thỉnh String... argsthoảng bạn cũng có thể thấy , tương đương.
vikingsteve

68
lập chỉ mục bắt đầu từ 0. (trái với C cung cấp cho bạn tên của chương trình)
AdrieanKhisbe

1
@Daniel, Được argsđảm bảo tách biệt bởi không gian bất kể hệ điều hành?
Pacerier

@Pacerier xin lỗi tôi đến muộn rất nhiều và tôi không có nguồn, nhưng tôi tin chắc rằng họ có. Nó xuất hiện với tôi như thể java (.exe) đang xử lý các đối số, không phải shell / terminal bên dưới. Lấy -versionví dụ, nó java -versionjava.exe -version, nhưng không java.exe /version(cố gắng tải lớp chính .version). Chỉ cần 2 xu của tôi nếu ai đó vấp phải điều này.
Lu-ca

1
@Luke Điều đó không thể đúng, ít nhất là không phải trên các hệ thống Unix. Ở đó shell chuyển các đối số cho chương trình đã được phân tách theo quy tắc của shell (với trích dẫn / thoát được loại bỏ tương ứng). Không có cách nào để chương trình (trình thông dịch java trong trường hợp này) truy cập vào dòng lệnh unplit ban đầu, và cũng không nên làm như vậy bởi vì nó sẽ khiến người dùng nhầm lẫn.
regnarg

112

Chúng dành cho các đối số dòng lệnh trong Java.

Nói cách khác, nếu bạn chạy

java MyProgram một hai

Sau đó argschứa:

[ "một hai" ]

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

Lý do cho điều này là để cấu hình ứng dụng của bạn chạy một cách cụ thể hoặc cung cấp cho nó một số thông tin cần thiết.


Nếu bạn chưa quen với Java, tôi khuyên bạn nên đọc qua Hướng dẫn Java TM chính thức của Oracle .


45

argschứa các đối số dòng lệnh được truyền cho chương trình Java khi gọi. Ví dụ: nếu tôi gọi chương trình như vậy:

$ java MyProg -f file.txt

Sau đó argssẽ là một mảng chứa các chuỗi "-f""file.txt".


Cảm ơn câu trả lời.
Chaklader Asfak Arefe

Tôi đã phải biên dịch mã của mình trước javac MyProg.javavà hơn là chạy java MyProg -f file.txt. Có một lý do cho điều này, bởi vì không nơi nào trong câu trả lời được đề cập?
stanimirsp

@stanimirsp: Trước tiên, bạn phải biên dịch mã nguồn Java thành một .classtệp.
mipadi

19

Câu trả lời sau đây dựa trên sự hiểu biết của tôi và một số bài kiểm tra.

Chuỗi [] args là gì?

Trả lời->

Chuỗi [] -> Như chúng ta biết đây là mảng Chuỗi đơn giản.

args -> là tên của một mảng, nó có thể là bất cứ thứ gì (ví dụ: a, ar, argument, param, tham số) không có vấn đề gì với trình biên dịch & thực thi & tôi cũng đã thử nghiệm.

Ví dụ
1) đối số static void void main (String [])

2) static static void main (tham số String [])

Khi nào bạn sẽ sử dụng những args này?

Trả lời->

Các chức năng chính được thiết kế rất thông minh bởi các nhà phát triển. Suy nghĩ thực tế rất sâu sắc. Về cơ bản được phát triển dưới sự xem xét của C & C ++ dựa trên đối số dòng lệnh nhưng ngày nay không ai sử dụng nó nhiều hơn.

Điều 1- Người dùng có thể nhập bất kỳ loại dữ liệu nào từ dòng lệnh có thể là Số hoặc Chuỗi & cần thiết để chấp nhận nó bởi trình biên dịch mà kiểu dữ liệu nào chúng ta nên sử dụng? xem điều 2

Thing 2- String là kiểu dữ liệu hỗ trợ tất cả các kiểu dữ liệu nguyên thủy như int, long, float, double, byte, shot, char trong Java. Bạn có thể dễ dàng phân tích nó trong bất kỳ kiểu dữ liệu nguyên thủy nào.

Ví dụ: Chương trình sau đây được biên dịch và thực hiện và tôi cũng đã thử nghiệm.

Nếu đầu vào là -> 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    

  }
}

13

Ngay cả OP OP chỉ nói về String[] args, tôi muốn đưa ra một ví dụ hoàn chỉnh về public static void main(String[] args).

Public: là Công cụ sửa đổi truy cập , định nghĩa ai có thể truy cập Phương thức này. Công khai có nghĩa là Phương thức này sẽ có thể truy cập được bởi bất kỳ Lớp nào (Nếu các Lớp khác có thể truy cập Lớp này.).

Static: là một từ khóa xác định điều liên quan đến lớp. Điều này có nghĩa là Phương thức hoặc biến đã cho không liên quan đến thể hiện nhưng liên quan đến Lớp. Nó có thể được truy cập mà không cần tạo thể hiện của Class.

Void: được sử dụng để xác định Kiểu trả về của Phương thức. Nó định nghĩa những gì phương thức có thể trả về. Vô hiệu có nghĩa là Phương thức sẽ không trả về bất kỳ giá trị nào.

main: là tên của Phương thức. Tên Phương thức này được JVM tìm kiếm làm điểm bắt đầu cho một ứng dụng chỉ có một chữ ký cụ thể.

String[] args : là tham số cho Phương thức chính.

Nếu bạn xem mã nguồn 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;
...

Bạn có thể thấy rằng phương thức bắt đầu trong java phải được đặt tên mainvà phải có chữ ký cụ thểpublic static void main(String[] args)

Mã này cũng cho chúng tôi biết rằng mã public static void main(String[] args)này chưa được sửa, nếu bạn thay đổi mã trong (jdk-src \ j2se \ src \ share \ bin \ java.c) sang chữ ký khác, nó sẽ hoạt động nhưng việc thay đổi này sẽ gây ra cho bạn các vấn đề khác có thể xảy ra bởi vì thông số kỹ thuật java

Offtopic: Đã 7 năm kể từ khi OP hỏi câu hỏi này, tôi đoán bây giờ OP có thể trả lời câu hỏi của chính mình.


12

String [] args cũng là cách bạn khai báo một mảng Chuỗi trong Java.

Trong chữ ký phương thức này, mảng argssẽ được điền với các giá trị khi phương thức được gọi (như các ví dụ khác ở đây hiển thị). Vì bạn đang học, nên đáng để hiểu rằng argsmảng này giống như khi bạn tự tạo một phương thức, như trong:

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
}

12

Tôi sẽ chia tay

public static void main(String args[])

trong các bộ phận.

"công khai" có nghĩa là main () có thể được gọi từ bất cứ đâu.

"static" có nghĩa là main () không thuộc về một đối tượng cụ thể

"void" có nghĩa là hàm main () không trả về giá trị

"chính" là tên của một chức năng. main () là đặc biệt vì nó là sự khởi đầu của chương trình.

"Chuỗi []" có nghĩa là một mảng của Chuỗi.

"args" là tên của Chuỗi [] (trong phần thân của hàm main ()). "args" không đặc biệt; bạn có thể đặt tên cho nó bất cứ điều gì khác và chương trình sẽ hoạt động như nhau.

  • String[] argslà một tập hợp các Chuỗi, được phân tách bằng khoảng trắng, có thể được nhập vào chương trình trên thiết bị đầu cuối. Nhiều lần hơn không, người mới bắt đầu sẽ không sử dụng biến này, nhưng nó luôn luôn ở đó trong trường hợp.

9

Khi bạn hoàn thành mã của mình, bạn sẽ biến nó thành một tệp có phần mở rộng .java, có thể được chạy bằng cách nhấp đúp vào mã đó, nhưng cũng trong toàn bộ bảng điều khiển (thiết bị đầu cuối trên mac, cmd.exe trên windows) cho phép người dùng thực hiện nhiều thứ. Một điều là họ có thể thấy các thông báo trên bảng điều khiển (System.out.print hoặc System.out.println) mà họ không thể thấy nếu họ nhấp đúp chuột. Một điều khác họ có thể làm là chỉ định tham số, vì vậy thông thường bạn sẽ sử dụng dòng

java -jar MyCode.jar

sau khi điều hướng đến thư mục của chương trình với

cd C:My/Code/Location

trên cửa sổ hoặc

cd My/Code/Location

trên Mac (lưu ý rằng mac ít cồng kềnh hơn) để chạy mã, nhưng để chỉ định tham số bạn sẽ sử dụng

java -jar MyCode.jar parameter1 parameter2

Các tham số được lưu trữ trong mảng args mà bạn có thể sử dụng trong chương trình của mình là bạn muốn cho phép người dùng kiểm soát các tham số đặc biệt như sử dụng tệp nào hoặc chương trình có thể có bao nhiêu bộ nhớ. Nếu bạn muốn biết cách sử dụng một mảng, có lẽ bạn có thể tìm thấy một chủ đề trên trang web này hoặc chỉ cần google nó. Lưu ý rằng bất kỳ số lượng các tham số có thể được sử dụng.


9

Giải thích bằng ngôn ngữ của giáo dân đơn giản.

Phương thức chính mong muốn chúng ta cung cấp một số đối số khi chúng ta hướng JVM của mình đến tên lớp. Điều đó có nghĩa là, giả sử tên tệp của bạn là Try.java, bây giờ để thực thi điều này trong dấu nhắc lệnh, bạn viết "javac Try.java" để biên dịch theo sau là "java Thử" để thực thi. Bây giờ giả sử thay vì viết đơn giản là "java Thử" bạn viết "java Thử 1". Ở đây bạn đã thông qua một đối số "1". Điều này sẽ được thực hiện theo phương thức chính của bạn ngay cả khi bạn không sử dụng nó trong mã của mình.

Nếu bạn muốn kiểm tra xem phương thức chính của bạn có thực sự lấy tham số "1" hay không. Đơn giản, bên trong phương thức chính của bạn gõ như sau:

for(int i = 0; i < args.length; i++) {
        System.out.println("Argument is: "+args[i]);
    }

7

Tôi nghĩ rằng nó được bao phủ khá tốt bởi các câu trả lời ở trên String args[]chỉ đơn giản là một chuỗi các đối số chuỗi bạn có thể chuyển đến ứng dụng của mình khi bạn chạy nó. Để hoàn thành, tôi có thể thêm rằng nó cũng hợp lệ để xác định tham số phương thức được truyền cho mainphương thức dưới dạng đối số biến (varargs) của kiểu String:

public static void main (String... args)

Nói cách khác, mainphương thức phải chấp nhận một mảng String ( String args[]) hoặc varargs ( String... args) làm đối số phương thức. Và cũng không có phép thuật nào với cái tên argsđó. Bạn cũng có thể viết argumentshoặc thậm chí freddiefujiwaranhư được hiển thị bên dưới, ví dụ:

public static void main (String[] arguments)

public static void main (String[] freddiefujiwara)


6

Khi một lớp java được thực thi từ bàn điều khiển, phương thức chính là cái được gọi. Để điều này xảy ra, định nghĩa của phương pháp chính này phải là

public static void main(String [])

Thực tế là mảng chuỗi này được gọi là args là một quy ước chuẩn, nhưng không bắt buộc. Bạn sẽ điền vào mảng này tại dòng lệnh khi bạn gọi chương trình của mình

java MyClass a b c

Chúng thường được sử dụng để xác định các tùy chọn của chương trình của bạn, ví dụ như các tệp để ghi hoặc đọc từ đó.


6

trong public static void main (String args []) args là một mảng của đối số dòng bàn điều khiển có kiểu dữ liệu là String. trong mảng này, bạn có thể lưu trữ các đối số chuỗi khác nhau bằng cách gọi chúng tại dòng lệnh như dưới đây: java myProgram Shaan Royal sau đó Shaan và Royal sẽ được lưu trữ trong mảng dưới dạng arg [0] = "Shaan"; arg [1] = "Hoàng gia"; bạn cũng có thể thực hiện việc này một cách thủ công trong chương trình, khi bạn không gọi chúng theo dòng lệnh.


3

Phong cách dataType[] arrayRefVarđược ưa thích. Phong cách dataType arrayRefVar[]này xuất phát từ ngôn ngữ C / C ++ và được sử dụng trong Java để phù hợp với các lập trình viên C / C ++.


1

Các String[] argstham số là một mảng của Strings truyền như thông số khi bạn đang chạy ứng dụng của bạn thông qua dòng lệnh trong hệ điều hành.

Vì vậy, hãy tưởng tượng bạn đã biên dịch và đóng gói một myApp.jarứng dụng Java. Dĩ nhiên, bạn có thể chạy ứng dụng của mình bằng cách nhấp đúp vào ứng dụng trong HĐH, nhưng bạn cũng có thể chạy ứng dụng đó bằng cách sử dụng dòng lệnh, như (ví dụ trong Linux):

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

Khi bạn gọi ứng dụng của bạn chuyển một số tham số, như:

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

Các java -jarlệnh sẽ vượt qua Strings của bạn updatenotifyđể bạn public static void main()phương pháp.

Sau đó, bạn có thể làm một cái gì đó như:

System.out.println(args[0]); //Which will print 'update'
System.out.println(args[1]); //Which will print 'notify'

0

Ngoài tất cả các ý kiến ​​trước đó.

public static void main(String[] args) 

có thể được viết như

 public static void main(String...arg)

hoặc là

 public static void main(String...strings)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.