我不确定如何设置它,但我的方法有一个用户输入一个介于最小值和最大值之间的数字,虽然我不知道如何使用{{1来处理NumberFormatException
阻止。关于如何解决这个问题,有什么建议吗?
try-catch
答案 0 :(得分:0)
static int promptForInt(String prompt, int min, int max){
System.out.println(prompt);
String input = in.readLine();
int parsedInt;
boolean exceptionThrown = false;
do {
try {
parsedInt = Integer.parseInt(input);
} catch(NumberFormatException e) {
exceptionThrown = true;
}
if (exceptionThrown || (!(parsedInt > min && parsedInt < max)) {
System.out.println("Your input is invalid. " + prompt);
input = in.readLine();
parsedInt = Integer.parseInt(input);
} else {
return parsedInt;
}
} while(true)
}
从我关于NumberFormatException的帖子
最后,我们来到了我们同意的地方,我们无法避免用户输入的情况&#34; abc&#34;作为数字字符串。为什么?因为他可以。在一个幸运的情况下,这是因为他是一个测试人员或者只是一个极客。在一个糟糕的情况下,它是攻击者。
我现在能做什么?嗯,Java给了我们try-catch
你可以做到以下几点:
try {
i = Integer.parseInt(myString);
} catch (NumberFormatException e) {
e.printStackTrace();
//somehow workout the issue with an improper input. It's up to your business logic.
}
在Java中,异常用于标记意外情况。例如,将非数字String
解析为数字(NumberFormatException
)或在null
引用(NullPointerException
)上调用方法。你可以通过多种方式捕捉它们。
try{
//some code
} catch (NumberFormatException e1) {
e.printStackTrace() //very important - handles the Exception but prints the information!
} catch (NullPointerException e2) {
e.printStackTrace();
}
或使用这一事实,他们都扩展Exception
:
try {
//somecode
} catch (Exception e) {
e.printStackTrace;
};
或者自Java 7以来:
try {
//somecode
} catch (NullPointerException | NumberFormatException e) {
e.printStackTrace;
};
答案 1 :(得分:-1)
如果你把它们当作方法而尝试做事情可以更容易处理:#34;尝试做某事,但由于X&#34;它无法实现。 X是个例外。
以下代码可能是您修改代码以处理异常的一种方式:
static int promptForInt(String prompt, int min, int max) {
Integer parsedInt = null; // use an Integer so null can be used to mean an invalid value
while (parsedInt == null) {
System.out.println(prompt);
String input = in.readLine();
int temp;
try {
temp = Integer.parseInt(input);
} catch(NumberFormatException e) {
System.out.print(input+" is not a number. ");
continue;
}
if (temp < min || temp > max) {
System.out.print("Your number must be between "+min+" and "+max+" (inclusive). ");
} else {
parsedInt = temp;
}
}
return parsedInt;
}
您应注意的一些事项:首先,您尚未定义in
。你可以这样做:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
如果你这样做,你很快就会发现你还有另外一个Exception要处理:这会抛出UnsupportedEncodingException,而readLine也会抛出IOException。
您的方法必须返回一个有效的整数,否则它将不会退出(您确实应该为用户提供一些退出循环的方法而不输入有效数字)。例如,如果您无法从System.in
读取任何内容,那么这是不可能的。您的方法需要一种合理的方式告诉来电者:&#34;我试图获得一个来自用户的int,除了我被X&#34;停止。
你可能最终会做更多的事情:
static int promptForInt(String prompt, int min, int max) throws UserInputException {
BufferedReader in;
try {
in = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
} catch(UnsupportedEncodingException unsupported) {
// create a new exception and supply the cause as an inner exception
throw new UserInputException("Could not open a reader for System.in", unsupported);
}
Integer parsedInt = null; // use an Integer so null can be used to mean an invalid value
while (parsedInt == null) {
System.out.println(prompt);
String input;
try {
input = in.readLine();
} catch (IOException ioException) {
throw new UserInputException("Could not read a line", ioException);
}
if (input.length() == 0) {
throw new UserInputException("User aborted input");
}
int temp;
try {
temp = Integer.parseInt(input);
} catch(NumberFormatException e) {
System.out.print(input+" is not a number. ");
continue;
}
if (temp < min || temp > max) {
System.out.print("Your number must be between "+min+" and "+max+" (inclusive). ");
} else {
parsedInt = temp;
}
}
return parsedInt;
}