2009-11-04 23 views
15

Tôi hiểu rằng String [] args là một mảng các chuỗi được chuyển thành chính làm tham số.Tại sao String [] arg yêu cầu trong Java?

java Print "Hello, World!" 

 

class Print { 
    public static void main(String[] args) { 
    System.out.println(args[0]); 
    } 
} 

Tuy nhiên, khi bạn không bao gồm nó như một tham số (ngay cả khi bạn không sử dụng), nó ném một ngoại lệ. Vậy tại sao nó lại được yêu cầu? Ngoài ra, tại sao nó không thể là một int [] hoặc boolean []?

Trả lời

31

Đó là chuỗi vì dòng lệnh được thể hiện bằng văn bản. Nếu bạn muốn chuyển đổi văn bản đó thành số nguyên hoặc boolean, bạn phải tự làm điều đó - làm thế nào hệ điều hành hoặc bootstrapper Java biết chính xác cách bạn muốn mọi thứ được phân tích cú pháp? Tôi giả sử Java có thể tìm phương thức chính có cùng số tham số như đối số dòng lệnh và sau đó thử phân tích cú pháp bằng cách sử dụng Integer.parseInt v.v ... nhưng điều này sẽ khá phức tạp và vẫn không đủ trong nhiều trường hợp.

Đối với nó là bắt buộc - về cơ bản các nhà thiết kế Java đã quyết định gắn vào một chữ ký phương thức duy nhất, đó là thẳng thắn đơn giản hơn cho phép nó là tùy chọn. Mặc dù vậy, có thể có - trong C#, bạn có thể có bất kỳ số nào trong số

static void Main() 
static void Main(string[] args) 
static int Main() 
static int Main(string[] args) 

Cuối cùng, nó không tạo ra nhiều khác biệt, trung thực. Không có nhược điểm đáng kể trong việc phải bao gồm tham số.

+0

Oi, tại sao tên thay đổi? – paxdiablo

+0

+1 - nó không tạo ra bất kỳ sự khác biệt nào. Di chuyển dọc theo, không có gì xảy ra ở đây :-) –

+0

@paxdiablo: Một chút thú vị do cuộc nói chuyện của tôi tại DevDays, đó là tất cả. Sẽ hoàn nguyên sau vài ngày hoặc một tuần. –

4

Hệ thống thời gian chạy Java trông cụ thể cho một phương thức có một tham số loại String[] duy nhất, bởi vì nó muốn chuyển các tham số đến phương thức main của bạn. Nếu không có phương thức như vậy, nó sẽ thông báo cho bạn thông qua một ngoại lệ.

Nếu bạn muốn xử lý tham số dòng lệnh (chuỗi) dưới dạng số nguyên hoặc boolean, bạn sẽ tự mình thực hiện chuyển đổi. Điều này cho phép bạn xử lý các điều kiện mà ai đó nhập "ponies" nơi bạn mong đợi một số nguyên.

+0

Tại sao? Nếu bạn biết lý do cho tôi biết tại đây-http: //stackoverflow.com/questions/33454612/significance-of-string-args-while-writing-main – abhishah901

2

Đó là cách ngôn ngữ được thiết kế. Cả C và C++ đều làm theo cách tương tự, mặc dù với một số lượng riêng biệt, thông tin được bao gồm trong mảng chuỗi cho Java.

Bạn có thể đã thiết kế nó để lấy số nguyên hoặc boolean nhưng điều đó sẽ bổ sung thêm công việc vào thời gian chạy Java vì lợi ích ít có khả năng.

Chuỗi có thể được sử dụng để truyền bất kỳ loại thông tin nào vào chương trình chính (bao gồm số nguyên và booleans). Không phải như vậy cho số nguyên nếu bạn muốn vượt qua trong một chuỗi (ngắn của người sử dụng phải tự mã hóa nó như là UTF-8 hoặc một cái gì đó, không phải cái gì đó sẽ yêu mến mọi người đến ngôn ngữ).

Chỉ cần nhớ khai báo. Bằng mọi cách, hãy nêu ra một yêu cầu thay đổi ngôn ngữ nếu bạn muốn (để làm cho nó tùy chọn, hoặc cho phép chữ ký khác) nhưng tôi nghi ngờ rằng sẽ không nhận được rất xa.

-1

Vì mã chạy chức năng main() của bạn trông rất cụ thể cho chữ ký đó. Hãy nghĩ về điều đó là có, ở đâu đó:

YourClass.main(new String[] { ... }); 

Rõ ràng, nếu chính mất bất cứ điều gì khác, điều này sẽ không thành công.

0

Đó là một quy ước.Phương thức này được sử dụng bởi trình thông dịch dòng lệnh và đó là cách nó mong đợi nó. Hơn nữa - trình biên dịch mong đợi chữ ký trong biểu mẫu cụ thể này và sẽ không biên dịch nếu bạn bỏ qua tham số, ví dụ:

+0

Tại sao? Nếu bạn biết lý do cho tôi biết tại đây- http://stackoverflow.com/questions/33454612/significance-of-string-args-while-writing-main – abhishah901

+0

Trình thông dịch * mong đợi chữ ký. Không có trình biên dịch. – abhishah901

0

Tham số string [] được sử dụng để lưu đối số dòng lệnh trước tiên là tên lớp. Hơn nữa, nếu bạn gọi phương thức chính của bạn mà không có chuỗi [] nó sẽ đơn giản là quá tải và JVM sẽ không gọi phương thức đó. Và nếu bạn bỏ qua phương thức này, JVM sẽ ném một ngoại lệ

+0

Đối số dòng lệnh đầu tiên không phải là tên lớp trong Java. Nếu chúng ta không chuyển bất kỳ đối số dòng lệnh nào, tức là chỉ cần nói java yourClassName, điều này sẽ không đặt className trong mảng String. Trong C/C++, File Name thực thi là đối số đầu tiên. – Vivek

Các vấn đề liên quan