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.