1

私がやろうとしているのは、try-catch 例外を使用してプログラムを再起動し、ユーザーにデータ値を再度取得させることです。どうすればいいですか?goto を使用して最初の行に戻そうとしましたが、うまくいきませんでした。(そして一般的なコンセンサスは、後藤が悪であるということです)。どんな助けでも大歓迎です。

Console.WriteLine("Please enter the two points that you wish to know the distance between:");
string point = Console.ReadLine();
string[] pointInput = point.Split(' ');


int pointNumber = Convert.ToInt16(pointInput[0]);                        //Stores the actual input number's into two integers
int pointNumber2 = Convert.ToInt16(pointInput[1]);

try                                                                      //Try-Catch statement to make sure that the User enters relevant PointNumbers
{
    double latitude = (Convert.ToDouble(items[pointNumber * 3]));            //
    double longtitude = (Convert.ToDouble(items[(pointNumber * 3) + 1]));    //
    double elevation = (Convert.ToDouble(items[(pointNumber * 3) + 2]));     //

    double latitude2 = (Convert.ToDouble(items[pointNumber2 * 3]));          //
    double longtitude2 = (Convert.ToDouble(items[(pointNumber2 * 3) + 1]));  //
    double elevation2 = (Convert.ToDouble(items[(pointNumber2 * 3) + 2]));   // Uses the relationship between the pointnumber and the array to select the required items from the array.


    //Calculate the distance between two point using the Distance class
    Console.WriteLine("The distance in km's to two decimal places is:");
    Distance curDistance = new Distance(latitude, longtitude, elevation, latitude2, longtitude2, elevation2);
    Console.WriteLine(String.Format("{0:0.00}", curDistance.toDistance()) + "km");
}
catch(IndexOutOfRangeException)
{

    Console.WriteLine("You have selected a point number outside the range of the data entered, please select two new pointnumbers");

  // here is where I would have the program restart  

}
4

8 に答える 8

3

プログラミングを学び始めると、while または do-while ループを使用してこれらの状況を解決できることがわかります。したがって、私はあなたにそのような答えを与えます:

            bool restart = false;
            do
            {
                restart = false;
                Console.WriteLine("Please enter the two points that you wish to know the distance between:");
                string point = Console.ReadLine();
                string[] pointInput = point.Split(' ');


                int pointNumber = Convert.ToInt16(pointInput[0]);                        //Stores the actual input number's into two integers
                int pointNumber2 = Convert.ToInt16(pointInput[1]);

                try                                                                      //Try-Catch statement to make sure that the User enters relevant PointNumbers
                {
                    double latitude = (Convert.ToDouble(items[pointNumber * 3]));            //
                    double longtitude = (Convert.ToDouble(items[(pointNumber * 3) + 1]));    //
                    double elevation = (Convert.ToDouble(items[(pointNumber * 3) + 2]));     //

                    double latitude2 = (Convert.ToDouble(items[pointNumber2 * 3]));          //
                    double longtitude2 = (Convert.ToDouble(items[(pointNumber2 * 3) + 1]));  //
                    double elevation2 = (Convert.ToDouble(items[(pointNumber2 * 3) + 2]));   // Uses the relationship between the pointnumber and the array to select the required items from the array.


                    //Calculate the distance between two point using the Distance class
                    Console.WriteLine("The distance in km's to two decimal places is:");
                    Distance curDistance = new Distance(latitude, longtitude, elevation, latitude2, longtitude2, elevation2);
                    Console.WriteLine(String.Format("{0:0.00}", curDistance.toDistance()) + "km");
                }
                catch (IndexOutOfRangeException)
                {

                    Console.WriteLine("You have selected a point number outside the range of the data entered, please select two new pointnumbers");
                    restart = true;
                }
            } while (restart);

Main 内で Main を呼び出すと、StackOverflowException が発生する可能性があることに注意してください:-D

于 2012-10-27T11:38:01.833 に答える
1

コンソール アプリケーションである限り、Mainメソッドをcatchブロックで呼び出すことができます。

private static int m_NumberOfRetries = 5; //Define how many times application can "restart" itself to avoid stackoverflow. 

static void Main(string[] args)
{
    try
    {
        //Do something useful
    }
    catch
    {
        m_NumberOfRetries--;
        if (m_NumberOfRetries != 0)
        {
            Main(args);
        }
    }
 }

しかし、そうするのは良い習慣ではありません。これは、アプリケーションでユーザー入力をチェックすることで回避できます。

于 2012-10-27T11:21:25.683 に答える
1

常に操作する前に、入力を検証することを検討する必要があります。ユーザー入力を受け入れて検証するための特殊なメソッドを作成することを検討してください。このメソッドは、検証が成功するまで内部的にユーザー入力を要求し続けることができます。

于 2012-10-27T11:23:50.520 に答える
0
catch()
{
  console.writeline("Some error");
  private void restart()
   {
    //write Press any key to restart the program 

   //clear the screen;

  //call the main method; 
  }
}
于 2012-10-27T11:30:06.730 に答える
0
// Starts a new instance of the program itself
System.Diagnostics.Process.Start(Application.ExecutablePath);

// Closes the current process
Environment.Exit(0);
于 2012-10-27T11:27:05.547 に答える
0

入力の読み取りを再度開始することのみを検討してください。それが必要な場合は、次のものが適しています。

メソッド getData() を Distance クラスに配置します。クラス Distance には、ノンパラメトリック コンストラクターが必要です。

距離.java

private double latitude;
private double longitude;
private double elevation;
private double latitude2;
private double longitude2;
private double elevation2;

public Distance() {}

public boolean getData(){
    Console.WriteLine("Please enter the two points that you wish to know the distance between:");
    string point = Console.ReadLine();
    string[] pointInput = point.Split(' ');
    int pointNumber = Convert.ToInt16(pointInput[0]);
    int pointNumber2 = Convert.ToInt16(pointInput[1]);
    try{
        latitude = (Convert.ToDouble(items[pointNumber * 3]));            //
        longtitude = (Convert.ToDouble(items[(pointNumber * 3) + 1]));    //
        elevation = (Convert.ToDouble(items[(pointNumber * 3) + 2]));     //

        latitude2 = (Convert.ToDouble(items[pointNumber2 * 3]));          //
        longtitude2 = (Convert.ToDouble(items[(pointNumber2 * 3) + 1]));  //
        elevation2 = (Convert.ToDouble(items[(pointNumber2 * 3) + 2]));   // I assume the exception goes from these 6 lines               

        return true;
    } catch (IndexOutOfRangeException) {
        return false;
    }
}

Main.java:

Distance curDistance = new Distance();
while(!curDistance.getData()) 
    Console.WriteLine("You have selected a point number outside the range of the data entered, please select two new pointnumbers"); 
Console.WriteLine("The distance in km's to two decimal places is:");   
Console.WriteLine(String.Format("{0:0.00}", curDistance.toDistance()) + "km");

while ループは、入力が正しくない限り、プログラムに入力を要求させます。

于 2012-10-27T11:29:11.207 に答える
0

ユーザー データ入力の問題とプログラム実行の例外には大きな違いがあり、それぞれを処理するために 2 つの独立したメカニズムが必要です。

ユーザー データ入力の問題 (たとえば、数字が必要な場所に "abc" を入力するユーザー) は、入力検証メカニズム (作成者が作成) によって処理する必要があります。このタイプの問題はユーザーが修正できます。通常、検証失敗の理由がユーザーに表示され、データを再入力する機会が与えられます。

プログラム実行例外は、ユーザーが修正することはできず (たとえば、データベースに接続しようとしてタイムアウトが発生した場合)、言語に組み込まれている try/catch メカニズムを使用して処理する必要があります。

多くの理由から、try/catch メカニズムを使用してプログラムのフロー制御を提供することは、プログラミングの実践として不適切であると考えられています (これは、あなたが行おうとしていることです)。

于 2012-10-27T13:08:52.470 に答える