0

通过使用 try/catch 块,我对错误捕获有了基本的了解,但是我的捕获方法使用户在输入无效字符后重新启动程序。

有人可以演示如何在允许程序运行的同时进行有效的错误陷阱吗?

代码 :

import java.io.*; //Input/Output command; this part is ESSENTIAL

class FindingTheSurfaceAreaOfAPyramid2
{
    public static void main (String[] args) throws IOException
    {
        BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in));   //Loading the Text Box

        //Defining variables and string 'nicknames'
        String stringBaseLength, stringBaseWidth, stringTriangleHeight;  //named strings for organization's sake
        double convertToNumL, convertToNumW, convertToNumH, total1, total2, total3;   //'double' is nessesary for decimal answers as they commonly happen, using 'int' will round the result; inaccurate!
        //used in 'if' statements
        boolean realNumber = true;
        boolean realNumber2 = true;
        boolean realNumber3 = true;

        //First message and notice
        System.out.println ("Note: This program is compatible with ONLY rectangular based pyramids.");

        //Question 1: Units
        System.out.println ("First off, what unit is this pyramid in? (ex. cm, mm, in, ft. etc.)");
        String Units = myInput.readLine ();

        //Question 2: Length
        System.out.println ("1) Please enter the length of the base.");
        stringBaseLength = myInput.readLine ();
        try
        {
            Integer.parseInt (stringBaseLength);
            System.out.println ("Your base length is " + stringBaseLength + " " + Units + ".");  //this line is restating the the input as well as the unit of measurement
        }
        catch (NumberFormatException e)
        {
            //If they catch anything other than numbers, it would tell the user
            System.out.println ("That was either a smart remark, a negative number or jibberish.");
            System.out.println ("As a consequence, you have to restart the program.");
            realNumber = false;


        }
        if (realNumber)
        {
            //Question 3: Width
            System.out.println ("2) Please enter the width of the base");
            stringBaseWidth = myInput.readLine ();


            try
            {
                Integer.parseInt (stringBaseWidth);
                System.out.println ("Your base width is " + stringBaseWidth + " " + Units + ".");

            }
            catch (Exception e)
            {
                System.out.println ("That was either a smart remark, a negative number or jibberish.");
                System.out.println ("As a consequence, you have to restart the program.");
                realNumber2 = false;

            }
            if (realNumber2)
            {
                //Question 4: Height
                System.out.println ("3) Please enter the height of the triangle face.");
                stringTriangleHeight = myInput.readLine ();

                try
                {
                    Integer.parseInt (stringTriangleHeight);
                    System.out.println ("Your triangle height is " + stringTriangleHeight + " " + Units + ".");
                }
                catch (Exception e)
                {
                    System.out.println ("That was either a smart remark, a negative number or jibberish.");
                    System.out.println ("As a consequence, you have to restart the program.");
                    realNumber3 = false;
                }
                if (realNumber3)
                {

                    //Converting the input to 'double' to express the answer(s) in decimal format
                    convertToNumH = Double.parseDouble (stringTriangleHeight);
                    convertToNumL = Double.parseDouble (stringBaseLength);
                    convertToNumW = Double.parseDouble (stringBaseWidth);
                    total1 = convertToNumL * convertToNumW;         //base area, length x width
                    total2 = convertToNumL * convertToNumH / 2;     //triangle area using sidelength 'length', base x height / 2
                    total3 = convertToNumW * convertToNumH / 2;     //triangle area using sidelength 'width  ,  base x height / 2

                    //Calculations and concluding sentences
                    System.out.println ("The area of the triangle with base length " + convertToNumL + " cm is " + total2 + Units + "^2.");
                    System.out.println ("The area of the triangle with base length " + convertToNumW + " cm is " + total3 + Units + "^2.");
                    System.out.println ("The base area is " + total1 + " " + Units + "^2.");
                    System.out.println ("The total surface area is " + (total1 + total2 + total2 + total3 + total3) + " " + Units + "^2.");
                }
            }
        }
    }
} //end
4

3 回答 3

4

您发布了很多代码,但是错误后继续的一种模式非常简单。在伪代码中:

boolean validInput = false;
while (!validInput) {
    // Read some input from the user
    // If it's of the right format, set validInput to true
    // Else print an error message, and don't change validInput
}

循环将继续执行,直到用户输入有效的内容(或终止程序,当然)。

于 2013-02-26T19:42:20.720 回答
0

您需要循环它直到用户输入 realNumber

boolean realNumber = false;
        while(!realNumber)
        {

    BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in));   //Loading the Text Box

            //Defining variables and string 'nicknames'
            String stringBaseLength, stringBaseWidth, stringTriangleHeight;  //named strings for organization's sake
            double convertToNumL, convertToNumW, convertToNumH, total1, total2, total3;   //'double' is nessesary for decimal answers as they commonly happen, using 'int' will round the result; inaccurate!
            //used in 'if' statements

            boolean realNumber2 = true;
            boolean realNumber3 = true;

            //First message and notice
            System.out.println ("Note: This program is compatible with ONLY rectangular based pyramids.");

            //Question 1: Units
            System.out.println ("First off, what unit is this pyramid in? (ex. cm, mm, in, ft. etc.)");
            String Units = myInput.readLine ();

            //Question 2: Length
            System.out.println ("1) Please enter the length of the base.");
             try
                    {
                        Integer.parseInt (stringBaseLength);
                        System.out.println ("Your base length is " + stringBaseLength + " " + Units + ".");  //this line is restating the the input as well as the unit of measurement
realNumber = true;
                    }
                    catch (NumberFormatException e)
                    {
                        //If they catch anything other than numbers, it would tell the user
                        System.out.println ("That was either a smart remark, a negative number or jibberish.");
                        System.out.println ("As a consequence, you have to restart the program.");
                        realNumber = false;


                    }
        }
于 2013-02-26T19:40:03.423 回答
0

您需要重构代码并删除重复项。如果您与以下代码进行比较,您的代码会更加混乱并且容易出现错误。根据需要和可以重复使用的功能来减少功能。重用应该是重中之重。如何消除不必要的步骤?

 public class Test{

 static String Units=null;
 static BufferReader myInput 
 public static void main (String[] args){
 //Your Main function
 //Initialize the BufferReader and Read the UNITS
 // Sysouts with your questions
  convertToNumL=readDimension();
 // Sysouts with your questions
  convertToNumW=readDimension();
 // Sysouts with your questions
  convertToNumH=readDimension();

  //Your Calculations 

  }

  public static Double readDimension()
  {
      String temp=null;
      while(true) {

          temp=myInput.readLine();
          while(verifyDimension(temp)){

             return Double.parseDouble(temp);

          }

      } 


  }       

  public static boolean verifyDimension(String temp){

     boolean verify=true;

      try{

      Double.parseDouble(temp) ;

      }catch(NumberFormatException e){

        verify=false;

         //Your Statements
      }
       return verify;

  }            


 }
于 2013-02-27T04:12:02.273 回答