28

このエラーが発生する理由はわかりませんが、キューが初期化されているかどうかを既に確認しているため、このコードをコンパイルするべきではありませんか?

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) で終了しているので?

私にいくつかの指針を与えることができることを願っています:)

ありがとう。

4

4 に答える 4

75

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

Queue queue = null;
于 2008-11-01T20:35:29.280 に答える
9

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

于 2008-11-01T20:35:14.053 に答える
8

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

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に初期化します。これは、「初期化されていない変数を自分で見つけます。ありがとうございます」というコンパイラのトリックです。これは便利なトリックですが、この場合は好きではありません。if ブランチが多すぎて、適切に実行しているかどうかを簡単に確認できません。本当にこのようにしたい場合は、次のようなものがより明確になります。

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());
}
于 2008-11-02T01:36:06.130 に答える
0

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

于 2008-11-01T20:47:18.210 に答える