我通过使用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
答案 0 :(得分: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
}
循环将继续执行,直到用户输入有效的内容(当然也会杀死程序)。
答案 1 :(得分: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;
}
}
答案 2 :(得分: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;
}
}