Java: Kiểm tra xem các đối số dòng lệnh có rỗng không


89

Tôi đang tìm cách kiểm tra lỗi cho các đối số dòng lệnh của mình

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 ngoại lệ mảng nằm ngoài giới hạn, điều này có ý nghĩa. Tôi chỉ đang tìm cách sử dụng thích hợp.

Câu trả lời:


159

Các đối số không bao giờ có thể được null. Họ sẽ 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 của các đối số của mình.

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);
    }
}

18

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

Tuy nhiên, nếu một số phần khác của ứng dụng gọi một mainphương thức, thì có thể hiểu rằng nó có thể truyền một nullđối số hoặc nullmảng đối số.

Tuy nhiên (2), đây rõ ràng là một trường hợp sử dụng rất bất thường nó vi phạm nghiêm trọng hợp đồng ngụ ý đối với mainphương pháp điểm đầu vào. Do đó, tôi không nghĩ rằng bạn nên kiểm tra các nullgiá trị đối số 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ã cuộc gọi để có được a NullPointerException. Rốt cuộc, nó là một lỗi trong người gọi vi phạm hợp đồng.


11

Để mở rộng về điểm này:

Có thể bản thân biến args sẽ là null, nhưng không phải thông qua thực thi bình thường. Việc thực thi bình thường sẽ được sử dụng java.exelà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 C++mã đã biên dịch với JNI để sử dụng jvm.dll, bỏ qua hoàn toàn java.exe. Trong trường hợp này, có thể chuyển NULLđến phương thức chính, trong trường hợp này, args sẽ là null.

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


0

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


1
Kiểm tra không cần thiết KHÔNG phải là thực hành tốt. Các nullkiểm tra là không cần thiết, nhưng bạn là chính xác rằng lengthkiểm tra là cần thiết,
Stephen C

0

Nếu tôi muốn kiểm tra xem có bất kỳ vị trí cụ thể nào của đối số dòng lệnh được thông qua hay không thì làm thế nào để kiểm tra? Ví dụ như trong một số trường hợp, 2 dòng lệnh args sẽ được chuyển và trong một số chỉ một dòng lệnh sẽ được chuyển thì làm cách nào để kiểm tra khi dòng dấu phẩy cụ thể được truyền hay không?

public class check {

public static void main(String[] args) {
if(args[0].length()!=0)
{
System.out.println("entered first if");
}
if(args[0].length()!=0 && args[1].length()!=0)
{
System.out.println("entered second if");
}
}
}

Vì vậy, trong đoạn mã trên nếu args [1] không được thông qua thì tôi nhận được java.lang.ArrayIndexOutOfBoundsException:

vậy làm cách nào để giải quyết vấn đề này, nơi tôi có thể kiểm tra xem tranh luận thứ hai có được thông qua hay không và nếu được thông qua thì hãy nhập nó. cần hỗ trợ càng sớm càng tốt.


Vui lòng đặt câu hỏi này. Vì nó không trả lời câu hỏi nên nó không thuộc về đây. Thay vào đó, bằng cách đặt một câu hỏi, bạn có cơ hội nhận được câu trả lời cao hơn nhiều.
AlexH

-10

Nếu bạn không chuyển bất kỳ đối số nào thì ngay cả trong trường hợp đó, args vẫn được khởi tạo nhưng không có bất kỳ mục / phần tử nào. Hãy thử cách sau, bạn sẽ nhận được hiệu quả tương tự :

 
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, mainphương thức sẽ được gọi với một argsmảng có độ dài bằng 0.
Stephen C

@Stephen Một mảng không có bất kỳ phần tử nào bên trong, có độ dài bằng không. Vậy thì câu trả lời của tôi có gì sai?
Puspendu Banerjee

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

1
Ok tôi hiểu rồi. Sẽ có ích nếu bạn không gõ sai câu đầu tiên của mình. Như đã viết, nó là không thể hiểu được. Tôi lưu ý rằng bạn đã lặng lẽ sửa nó trong bình luận cuối cùng của bạn. Lén lút.
Stephen C

1
"Tôi đã không đưa ra bất kỳ giải pháp nào thay vì cố gắng mô tả vấn đề". Sau đó, không đăng một câu trả lời. Đăng một bình luận.
Stealth Rabbi,
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.