2017-07-16 1 views
-6

私が抱えている問題は、試しにキャッチして(ユーザーが情報を入力するように求められる)たびに間違ったことを入力したり誤って入力したりするとエラーが発生します。私がtry catchを置くと、それは機能しません、それはちょうどプログラムを終了します。私がままにするとここキャッチブロックの問題を試す

namespace MaxHeartRate 

{

class Program 
{ 

    static void Main(string[] args) 
    { 
     // Display program instructions 
     DisplayInstructions(); 

     // Collected user info 
     CollectUserInfo(); 

    } 
    static void DisplayInstructions() 
    { 
     Console.WriteLine("************************************************"); 
     Console.WriteLine("This program will Calculate your Max Heart Rate"); 
     Console.WriteLine("Also your Mininum and Maximum target Heart rate"); 
     Console.WriteLine("You will have to enter your info in when promted"); 
     Console.WriteLine("************************************************"); 
     return; 
    } 
    static void CollectUserInfo() 
    { 
     // Declar Variables 
     string firstName, lastName; 
     int birthYear = 0; 
     int currentYear = 0; 
     int age; 
     double maxHeartRate, minTargetHeartRate, maxTargetHeartRate; 

     try 
     { 
      // User is asked to enter info 
      Console.Write("Enter your first Name: "); 
      firstName = Console.ReadLine(); 
      Console.Write("Enter your last name: "); 
      lastName = Console.ReadLine(); 
      Console.Write("Enter the current year: "); 
      currentYear = int.Parse(Console.ReadLine()); 
      Console.Write("Enter your birth year: "); 
      birthYear = int.Parse(Console.ReadLine()); 


      // Find Age 
      age = findAge(currentYear, birthYear); 

      // Find Max Heart rate 
      maxHeartRate = findMaxHR(age); 

      // Find Minimum Target Heart Rate 
      minTargetHeartRate = findMinTHR(maxHeartRate); 

      // Find Maximum Target Heart Rate 
      maxTargetHeartRate = findMaxTHR(maxHeartRate); 

      // Display Information 
      DisplayInformation(firstName, lastName, age, maxHeartRate, minTargetHeartRate, maxTargetHeartRate); 
     } 
     catch (Exception) 
     { 

      Console.WriteLine("Invalid input. Please try again"); 
     } 

     // Methods 
    } 
    static int findAge(int cYear, int bYear) 
    { 
     int age = cYear - bYear; 
     return age; 
    } 
    static int findMaxHR(int age) 
    { 
     int MHR = 220 - age; 
     return MHR; 
    } 
    static double findMinTHR(double maxHeartRate) 
    { 
     double minTHR = maxHeartRate * 0.50; 
     return minTHR; 
    } 
    static double findMaxTHR(double maxHeartRate) 
    { 
     double maxTHR = maxHeartRate * 0.85; 
     return maxTHR; 
    } 
    // Display information 
    static void DisplayInformation(string firstName, string lastName, int age, double maxHeartRate, double minTargetHeartRate, double maxTargetHeartRate) 
    { 
     Console.WriteLine(); 
     Console.WriteLine("************************************************"); 
     Console.WriteLine("Hello " + firstName + " " + lastName + " You are " + age + " Years old" + 
      "\n" + "\nYour Max Heart rate is " + maxHeartRate + 
      " BPM" + "\n" + "\nYour Minimum Target Heart rate is " + minTargetHeartRate + " BPM" + 
      "\n" + "\nwith a Maximum Target Heart rate of " + maxTargetHeartRate + " BPM"); 
     Console.WriteLine("************************************************"); 
     Console.Write("Push enter to exit"); 
     Console.ReadKey(); 
    } 
} 

}

+0

:それ以外の場合は、次のコードが動作age = findAge(currentYear, birthYear)

とラインでCS0165: Use of unassigned local variable 'currentYear'を取得します何とか戻ってもう一度尋ねる。また、 'Int.TryParse'を使ってtry/catchを避けることもできます。 – Gusman

+3

try/catchの助けが必要なら、どうやって実装したのか教えてください。 – oerkelens

+1

デバッガを使用すると通常は揺れます。 –

答えて

0

まず、currentYearをtry/catch(コンパイラがコードパスを解釈する方法のためtryとcatchの両方)または宣言時に定義する必要があります。あなたはのtry-catchでコードを囲むと、エラーが発生した場合、それはキャッチにジャンプしますので、あなたが必要とする

static void CollectUserInfo() 
{ 
    // Declar Varibals 
    string firstName, lastName; 

    // We can define these here so that there isn't a compiler error. 
    int birthYear = 0; 
    int currentYear = 0; 
    int age; 
    double maxHeartRate, minTargetHeartRate, maxTargetHeartRate; 

    // User is asked to enter info 
    Console.Write("Enter your first Name: "); 
    firstName = Console.ReadLine(); 
    Console.Write("Enter your last name: "); 
    lastName = Console.ReadLine(); 
    try 
    { 
     Console.Write("Enter the current year: "); 
     currentYear = int.Parse(Console.ReadLine()); 
     Console.Write("Enter your birth year: "); 
     birthYear = int.Parse(Console.ReadLine()); 
    } 
    catch (Exception) 
    { 
     // The result of the error. 
     Console.WriteLine("Invalid input."); 
     CollectUserInfo(); 
    } 
    // Find Age 
    age = findAge(currentYear, birthYear); 

    // Find Max Heart rate 
    maxHeartRate = findMaxHR(age); 

    // Find Minimum Target Heart Rate 
    minTargetHeartRate = findMinTHR(maxHeartRate); 

    // Find Maximum Target Heart Rate 
    maxTargetHeartRate = findMaxTHR(maxHeartRate); 

    // Display Information 
    DisplayInformation(firstName, lastName, age, maxHeartRate, minTargetHeartRate, maxTargetHeartRate); 

// Methods 
} 
+0

ありがとう。私は今私が間違っていたものを見ます。それから私は今年の誕生日だけを囲んでいましたが、それは間違いを投げかけていました。私は変数が一緒に問題を引き起こしたと宣言しているのを参照してください。 – Maverick

0

どのようにすることができます例..ですそれが今であり、ユーザがちょうどそれがプログラムをクラッシュ入るプッシュのように出てキャッチしてみてください再試行でユーザーから有効な入力を受け取ります。

int currentYear; 
while (true) 
{ 
    var currentYearText = Console.ReadLine(); 
    if (int.TryParse(currentYearText, out currentYear)) 
    { 
     // User entered a valid integer 
     // Validating that integer 
     if (currentYear > 2000 && currentYear < 2050) 
     { 
      break; 
     } 
    } 

    Console.Write("Please enter valid year between 2000 and 2050"); 
} 

ユーザーが無効なデータを入力すると、再試行を試みます再び。ユーザー入力が有効な場合、コードはループから抜け出し、次のステートメントに進みます。

関連する問題