2017-05-13 12 views
0

私はC#での初心者です。ユーザーが何かを入力したときに検証の役割を果たすために 'Try and catch'ブロックを使用しようとしています。ユーザーが最初に無効な入力を入力したときに機能しますが、ユーザーが2回目に無効な入力を入力するとシステムがクラッシュします。Try-Catchブロックによる検証C#

私は、ユーザが正しい入力を入力しても、それほど成功していないときにtrueに設定されるbool変数を作成することでこの問題を解決しようとしました。

while (invalidInput == true) 
{ 
    try 
    { 
     { 
      Console.Write("Landscape Size: "); 
      LandscapeSize = Convert.ToInt32(Console.ReadLine()); 
      Console.Write("Initial number of warrens: "); 
      InitialWarrenCount = Convert.ToInt32(Console.ReadLine()); 
      Console.Write("Initial number of foxes: "); 
      InitialFoxCount = Convert.ToInt32(Console.ReadLine()); 
      Console.Write("Randomness variability (percent): "); 
      Variability = Convert.ToInt32(Console.ReadLine()); 
      FixedInitialLocations = false; 
     } 
     Sim = new Simulation(LandscapeSize, InitialWarrenCount, InitialFoxCount, Variability, FixedInitialLocations); 
    } 
    catch 
    { 
     Console.WriteLine("invalid input!"); 
     LandscapeSize = Convert.ToInt32(Console.ReadLine()); 
     InitialWarrenCount = Convert.ToInt32(Console.ReadLine()); 
     InitialFoxCount = Convert.ToInt32(Console.ReadLine()); 
     Variability = Convert.ToInt32(Console.ReadLine()); 
     invalidInput = true; 
    } 
    invalidInput = false; 
} 

また、私は新しいです:ユーザーが正しい入力

C#のコードを入力すると

主な問題は、私はシステムを作る方法がわからないではfalseにブール変数を設定しました私は間違いがあれば申し訳ありませんオーバーフローをスタックする。

私の質問は何ですか?ありがとう

+0

これは非常に悪い考えですが、あなたのバグは関係なく、ループの後に 'invalidInput = false; 'を設定しています。 'try 'の最後にある必要があります –

+0

なぜそれは悪い考えですか?もっと効率的で簡単な方法がありますか?そしてあなたに感謝します。 – PRedator

+3

'int.TryParse'は、より高速で、例外が制御フローに使用されるべきではないため、どちらも望ましいです。 –

答えて

3

invalidInputは、ループが実行されるたびにtry-catchブロックとは独立してfalseに設定されています。代わりにtryブロックの最後に移動します。この方法で、フラグを設定する前にtryブロックのすべてのコードがエラーをスローしないようにします。しかし、制御フローに例外が使用されることはめったにないので、のif文のような何らかの制御文を使用してください。

1

try blockの末尾にinvalidInputfalseと設定する必要があります。

ただし、例外ではなくフローを制御するのにint.TryParseを使用してください。

int landscapeSize; 

Console.Write("Landscape Size: "); 
while(!int.TryParse(Console.ReadLine(), out landscapeSize)) 
{ 
    Console.Write("Invalid input. Enter landscape size: "); 
} 

すべての入力に対してこれを行います。

+0

私と同じだがもっと短くて(私はおそらく同時に書かれているだろう)。私は私の答えを削除しました:D –

関連する問題