Java : 명령 줄 인수가 null인지 확인


89

내 명령 줄 인수에 대한 오류 검사를 수행하려고합니다.

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

그러나 이것은 범위를 벗어난 예외를 반환합니다. 나는 적절한 사용법을 찾고 있습니다.

답변:


159

인수는 절대 null. 그들은 단지 존재하지 않을 것입니다.

즉, 당신이해야 할 일은 당신의 주장의 길이를 확인하는 것입니다.

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

@jjnguy의 대답은 대부분의 상황에서 정확합니다. 응용 프로그램을 실행하여 호출하면 정상적인 방식으로 명령 줄에서 실행되는 경우 null인수 배열 (또는 null배열)에 문자열 이 표시되지 않습니다 main.

그러나 응용 프로그램의 다른 부분이 main메서드를 호출하는 경우 null인수 또는 null인수 배열을 전달할 수 있습니다 .

그러나 (2), 이것은 분명히 매우 이례적인 사용 사례입니다, 그리고 그것은에 대한 묵시적 계약의 지독한 위반 main진입 점 방법. 따라서 .NET에서 null인수 값을 확인해야한다고 생각하지 않습니다 main. 드물게 발생하는 경우 호출 코드가 NullPointerException. 결국 계약을 위반하는 것은 호출자의 버그입니다.


11

이 지점을 확장하려면 :

args 변수 자체가 널 (null)이 될 수 있지만 정상적인 실행을 통해서는 불가능합니다. 정상적인 실행은 java.exe명령 줄의 진입 점으로 사용 됩니다. 그러나 C++JNI로 컴파일 된 코드를 사용 jvm.dll하여 java.exe를 완전히 우회하는 일부 프로그램을 보았습니다 . 이 경우 NULLmain 메서드 에 전달할 수 있으며이 경우 args는 null이됩니다.

항상 확인 if ((args == null) || (args.length == 0))하거나 if ((args != null) && (args.length > 0))필요에 따라 권장 합니다.


0

을 확인해야합니다 (args == null || args.length == 0). null검사가 실제로 필요 하지는 않지만 좋은 방법입니다.


1
불필요한 검사는 좋은 습관이 아닙니다. null검사는 필요하지 않습니다,하지만 당신은 것을 올바른지 length, 확인이 필요합니다
— 스티븐 C

0

명령 줄 인수의 특정 위치가 통과되었는지 확인하려면 어떻게 확인합니까? 예를 들어 일부 시나리오에서 2 개의 명령 줄 인수가 전달되고 일부에서는 하나만 전달 된 다음 특정 명령 줄이 전달되었는지 여부를 어떻게 확인합니까?

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

따라서 위 코드에서 args [1]이 전달되지 않으면 java.lang.ArrayIndexOutOfBoundsException이 발생합니다.

그래서 두 번째 주장이 통과되었는지 여부를 확인하고 통과하면 입력 할 수있는이 문제를 어떻게 해결해야합니까? 최대한 빨리 도움이 필요합니다.


질문 해주세요. 질문에 대한 답이 아니기 때문에 여기에 속하지 않습니다. 대신 질문을하면 답을 얻을 가능성이 훨씬 더 높아집니다.
— AlexH

-10

인수를 전달하지 않으면이 경우에도 인수가 초기화되지만 항목 / 요소가 없습니다. 다음 중 하나를 시도하면 동일한 효과를 얻을 수 있습니다 .

 
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
이것은 완전히 잘못된 것입니다. 명령 줄 인수없이 응용 프로그램을 시작하면 길이가 0 인 배열로 main메서드가 호출 args됩니다.
— Stephen C

@Stephen 내부에 요소가없는 배열은 길이가 0입니다. 그러면 내 대답에 대해 무엇이 잘못 되었습니까?
— Puspendu Banerjee

@Puspendu-잘못된 것은 dummy[0]배열 인덱스가 범위를 벗어난 예외 를 던지는 것입니다 !! 프로그램 (뒤로)을 테스트로 변경하고 args[0]인수없이 실행하는 경우에도 마찬가지입니다.
— Stephen C

1
알았어 이제 이해 했어. 첫 문장을 잘못 입력하지 않았다면 도움이되었을 것입니다. 쓰여진대로 이해할 수 없습니다. 마지막 댓글에서 조용히 수정했음을 확인합니다. 교활한.
— Stephen C

1
"나는 해결책을 제시하지 않고 오히려 문제를 설명하려고 노력했습니다". 그런 다음 답변을 게시하지 마십시오. 댓글 달기.
— Stealth Rabbi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.