質問

このエラーが発生する理由はわかりませんが、キューが初期化されているかどうかを確認しているので、このコードをコンパイルしないでください。

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ループに到達できませんか?プログラムはすでにEnvironment.Exit(0)で終了していますか?

希望を与えてくれるポインタがあります:)

ありがとう。

役に立ちましたか?

解決

コンパイラは、Environment.Exit()がプログラムを終了することを知りません。クラスで静的メソッドを実行しているだけです。宣言するときに queue をnullに初期化するだけです。

Queue queue = null;

他のヒント

コンパイラは、Environment.Exit()が返らないことを知りません。なぜ「戻る」だけではないのかMain()からですか?

問題を解決するいくつかの異なる方法:

Environment.Exitをreturnに置き換えるだけです。コンパイラーはreturnがメソッドを終了することを知っていますが、Environment.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の後にreturnステートメントを追加します。繰り返しになりますが、これはコンパイラーのトリックに近いものですが、人間にもセマンティクスを追加するため、若干正当な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());
}

コンパイラは、&quot; return&quot;を使用した場合にのみコードが到達可能であるか到達できないことを認識します。 Environment.Exit()を呼び出す関数と考えてください。コンパイラは、それがアプリケーションを閉じることを知りません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top