문제

왜이 오류가 발생하는지 잘 모르겠지만,이 코드 컴파일은 이미지 지 안되어 있어야합니다. 이미 큐가 초기화되고 있는지 확인하고 있기 때문입니까?

public static void Main(String[] args)
{
    Byte maxSize;
    Queue queue;

    if(args.Length != 0)
    {
        if(Byte.TryParse(args[0], out maxSize))
            queue = new Queue(){MaxSize = maxSize};
        else
            Environment.Exit(0);
    }
    else
    {
        Environment.Exit(0);
    }

    for(Byte j = 0; j < queue.MaxSize; j++)
        queue.Insert(j);
    for(Byte j = 0; j < queue.MaxSize; j++)
        Console.WriteLine(queue.Remove());
}

따라서 대기열이 초기화되지 않으면 For 루프가 도달 할 수 없습니까? 프로그램이 이미 환경과 함께 종료되므로 (0)?

나에게 몇 가지 포인터를 줄 수 있기를 바랍니다. :)

감사.

도움이 되었습니까?

해결책

컴파일러는 Environment.exit ()가 프로그램을 종료 할 것임을 모릅니다. 클래스에서 정적 메소드를 실행하는 것을 보게됩니다. 초기화 queue 당신이 그것을 선언 할 때 null에.

Queue queue = null;

다른 팁

컴파일러는 Environment.exit ()가 반환되지 않는 것을 모릅니다. 왜 main ()에서 "반환"하지 않는 이유는 무엇입니까?

문제를 해결하는 몇 가지 다른 방법 :

환경을 교체하십시오 .exit을 반품으로 교체하십시오. 컴파일러는 리턴이 메소드를 종료한다는 것을 알고 있지만 환경을 모릅니다 .exit.

static void Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return;
    } else {
       return;   
}

물론 모든 경우에 출구 코드로 0을 사용하기 때문에 실제로 도망 갈 수 있습니다. 실제로 Environment.exit을 사용하는 대신 int를 반환해야합니다. 이 특별한 경우에 이것은 내가 선호하는 방법입니다.

static int Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return 1;
    } else {
       return 2;
    }
}

큐를 null로 초기화합니다. 실제로 "내 자신의 초기화되지 않은 변수를 알아낼 것입니다. 대단히 감사합니다"라는 컴파일러 트릭 일뿐입니다. 유용한 트릭이지만이 경우에는 마음에 들지 않습니다. 당신은 당신이 제대로하고 있는지 쉽게 확인하기에 지점이 너무 많습니다. 만약 너라면 진짜 이런 식으로하고 싶었습니다. 이와 같은 것이 더 명확합니다.

static void Main(string[] args) {
  Byte maxSize;
  Queue queue = null;

  if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) {
     Environment.Exit(0);
  }
  queue = new Queue(){MaxSize = maxSize};

  for(Byte j = 0; j < queue.MaxSize; j++)
    queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
    Console.WriteLine(queue.Remove());
}

Environment.exit 이후의 반환 명령문을 추가하십시오. 다시 말하지만, 이것은 컴파일러 트릭에 더 가깝지만 인간에게도 의미론을 추가하기 때문에 약간 더 합법적 인 IMO입니다 (100% 코드 커버리지로부터 당신을 막을 수는 있지만)

static void Main(String[] args) {
  if(args.Length != 0) {
     if(Byte.TryParse(args[0], out maxSize)) {
        queue = new Queue(){MaxSize = maxSize};
     } else {
        Environment.Exit(0);
        return;
     }
  } else { 
     Environment.Exit(0);
     return;
  }

  for(Byte j = 0; j < queue.MaxSize; j++)
     queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
     Console.WriteLine(queue.Remove());
}

컴파일러는 "return"을 사용하는 경우 코드가 도달 할 수 없거나 도달 할 수 없다는 것을 알고 있습니다. Environment.exit ()를 호출하는 함수로 생각하면 컴파일러는 응용 프로그램을 닫을 것임을 알지 못합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top