質問
このエラーが発生する理由はわかりませんが、キューが初期化されているかどうかを確認しているので、このコードをコンパイルしないでください。
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()を呼び出す関数と考えてください。コンパイラは、それがアプリケーションを閉じることを知りません。