2010-10-06 40 views
65

Tôi đang tìm kiếm để làm một số kiểm tra lỗi cho các đối số dòng lệnh của tôiJava: Kiểm tra xem đối số dòng lệnh là null

public static void main(String[] args) 
{ 
    if(args[0] == null) 
    { 
     System.out.println("Proper Usage is: java program filename"); 
     System.exit(0); 
    } 
} 

Tuy nhiên, điều này trả về một mảng nằm ngoài giới hạn ngoại lệ, có ý nghĩa. Tôi chỉ đang tìm kiếm cách sử dụng phù hợp.

Trả lời

117

Đối số không bao giờ có thể là null. Họ chỉ không tồn tại.

Nói cách khác, những gì bạn cần làm là kiểm tra độ dài đối số của bạn.

public static void main(String[] args) 
{ 
    // Check how many arguments were passed in 
    if(args.length == 0) 
    { 
     System.out.println("Proper Usage is: java program filename"); 
     System.exit(0); 
    } 
} 
-8

Nếu bạn không vượt qua bất kỳ đối số nào thì ngay cả trong trường hợp đó args được khởi tạo nhưng không có bất kỳ mục/phần tử nào. Hãy thử một trong những tiếp theo, bạn sẽ nhận được cùng hiệu ứng:


public static void main(String[] args) throws InterruptedException { 
     String [] dummy= new String [] {}; 
     if(dummy[0] == null) 
     { 
      System.out.println("Proper Usage is: java program filename"); 
      System.exit(0); 
     } 

    } 
 
+1

Điều này hoàn toàn không chính xác. Nếu một ứng dụng được khởi chạy mà không có đối số dòng lệnh, phương thức 'main' sẽ được gọi với một mảng' args' có độ dài bằng 0. –

+0

@Stephen Một mảng không có phần tử bên trong, có độ dài bằng 0. Sau đó, những gì sai về câu trả lời của tôi? –

+0

@Puspendu - những gì là sai là 'dummy [0]' ném một chỉ số mảng ra khỏi giới hạn ngoại lệ !! Nếu bạn thay đổi chương trình (quay lại) để thử nghiệm 'args [0]' và chạy nó không có đối số. –

12

@ câu trả lời jjnguy là đúng trong hầu hết các tình huống. Bạn sẽ không bao giờ nhìn thấy một chuỗi null trong mảng đối số (hoặc một mảng null) nếu được gọi là main bằng cách chạy ứng dụng được chạy từ dòng lệnh theo cách thông thường.

Tuy nhiên, nếu một số phần khác của ứng dụng gọi phương thức main, có thể hiểu rằng nó có thể vượt qua đối số null hoặc null đối số.

Tuy nhiên (2), đây rõ ràng là trường hợp sử dụng rất bất thường, vi phạm nghiêm trọng hợp đồng ngụ ý cho phương thức nhập điểm main. Do đó, tôi không nghĩ bạn nên bận tâm kiểm tra các giá trị đối số null trong main. Trong trường hợp không chắc chắn rằng chúng xảy ra, có thể chấp nhận mã gọi để nhận NullPointerException. Sau khi tất cả, nó là một lỗi trong người gọi để vi phạm hợp đồng.

0

Bạn nên kiểm tra (args == null || args.length == 0). Mặc dù kiểm tra null không thực sự cần thiết, nhưng đó là một thực hành tốt.

6

Để mở rộng khi thời điểm này:

Có thể là biến args bản thân sẽ là null, nhưng không thông qua thực hiện bình thường. Việc thực hiện thông thường sẽ sử dụng java.exe làm điểm nhập từ dòng lệnh. Tuy nhiên, tôi đã thấy một số chương trình sử dụng mã biên dịch C++ với JNI để sử dụng jvm.dll, bỏ qua toàn bộ java.exe. Trong trường hợp này, có thể vượt qua NULL đến phương thức chính, trong đó trường hợp arg sẽ là rỗng.

Tôi khuyên bạn luôn luôn kiểm tra if ((args == null) || (args.length == 0)) hoặc if ((args != null) && (args.length > 0)) tùy theo nhu cầu của bạn.

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