수색…


통사론

  • 공공 정적 무효 메인 (문자열 [] args)

매개 변수

매개 변수 세부
args 명령 행 인수. main 메소드가 Java 시작 프로그램에 의해 호출된다고 가정하면 args 는 null이 아니며 null 요소가 없습니다.

비고

일반 Java 응용 프로그램이 java 명령 (또는 동등한 것)을 사용하여 시작되면 args 배열의 명령 행에서 인수를 전달하여 main 메소드가 호출됩니다.

아쉽게도 Java SE 클래스 라이브러리는 명령 인수 처리를 직접 지원하지 않습니다. 이렇게하면 두 가지 대안이 남게됩니다.

  • Java에서 손으로 인수 처리를 구현하십시오.
  • 타사 라이브러리를 사용하십시오.

이 주제는 인기있는 제 3 자 라이브러리를 다루려고 시도합니다. 포괄적 인 대안 목록을 보려면 StackOverflow 질문에 대한 답변 을 참조하십시오 . "Java에서 명령 줄 인수를 구문 분석하는 방법" .

GWT ToolBase를 사용한 인수 처리

옵션 매개 변수를 사용하는 등보다 복잡한 명령 행 인수를 구문 분석하려면 google의 GWT 방식을 사용하는 것이 가장 좋습니다. 모든 수업은 다음에서 공개됩니다.

https://gwt.googlesource.com/gwt/+/2.8.0-beta1/dev/core/src/com/google/gwt/util/tools/ToolBase.java

명령 줄 myprogram -dir "~/Documents" -port 8888 을 처리하는 예제는 다음과 같습니다.

public class MyProgramHandler extends ToolBase {
   protected File dir;
   protected int port;
   // getters for dir and port
   ...

   public MyProgramHandler() {
       this.registerHandler(new ArgHandlerDir() {
            @Override
            public void setDir(File dir) {
                this.dir = dir;
            }
       });
       this.registerHandler(new ArgHandlerInt() {
            @Override
            public String[] getTagArgs() {
               return new String[]{"port"};
            }
            @Override
            public void setInt(int value) {
               this.port = value;
            }
       });
   }
   public static void main(String[] args) {
      MyProgramHandler myShell = new MyProgramHandler();
      if (myShell.processArgs(args)) {
         // main program operation
         System.out.println(String.format("port: %d; dir: %s",
            myShell.getPort(), myShell.getDir()));
      }
      System.exit(1);
   }
}

ArgHandlerisRequired() 메소드도 가지고 있습니다.이 메소드는 명령 행 인수가 필요하다고 겹쳐 쓸 수 있습니다 (디폴트 리턴은 false 이므로 인수는 선택적입니다).

직접 인수 인수

응용 프로그램의 명령 줄 구문이 간단하면 사용자 지정 코드에서 명령 인수 처리를 수행하는 것이 합리적입니다.

이 예에서는 일련의 간단한 사례 연구를 제시합니다. 각각의 경우에 인수가 용인 할 수없는 경우 코드는 오류 메시지를 생성 한 다음 System.exit(1) 을 호출하여 명령이 실패했다는 것을 쉘에 알립니다. (각각의 경우에 Java 코드는 "myapp"라는 이름의 래퍼를 사용하여 호출된다고 가정합니다.)

인수가없는 명령

이 사례 연구에서는 명령에 인수가 필요하지 않습니다. 이 코드는 args.length 가 명령 줄 인수의 수를 args.length 보여줍니다.

public class Main {
    public static void main(String[] args) {
        if (args.length > 0) {
            System.err.println("usage: myapp");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked");
    }
}

두 개의 인수가있는 명령

이 사례 연구에서, 명령은 정확하게 두 개의 주장을 요구합니다.

public class Main {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("usage: myapp <arg1> <arg2>");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked: " + args[0] + ", " + args[1]);
    }
}

우리가 args.length 를 검사하는 것을 게을리한다면, 사용자가 너무 적은 명령 행 인자로 명령을 실행하면 명령이 충돌하게됩니다.

"플래그"옵션과 적어도 하나의 인수가있는 명령

이 사례 연구에서 명령에는 몇 가지 (옵션) 플래그 옵션이 있으며 옵션 뒤에 적어도 하나의 인수가 필요합니다.

package tommy;
public class Main {
    public static void main(String[] args) {
        boolean feelMe = false;
        boolean seeMe = false;
        int index;
        loop: for (index = 0; index < args.length; index++) {
            String opt = args[index];
            switch (opt) {
            case "-c":
               seeMe = true;
               break;
            case "-f":
               feelMe = true;
               break;
            default:
               if (!opts.isEmpty() && opts.charAt(0) == '-') {
                   error("Unknown option: '" + opt + "');
               }
               break loop;
            }
        }
        if (index >= args.length) {
            error("Missing argument(s)");
        }      
        
        // Run the application
        // ...
    }

    private static void error(String message) {
        if (message != null) {
            System.err.println(message);
        }
        System.err.println("usage: myapp [-f] [-c] [ <arg> ...]");
        System.exit(1);
   }
}

보시다시피 명령 구문이 복잡하면 인수와 옵션을 처리하는 것이 다소 번거로울 수 있습니다. "명령 행 구문 분석"라이브러리를 사용하는 것이 좋습니다. 다른 예들을 보라.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow