Мое исключение InputMismatchException не работает, поскольку, когда я вставляю что-то вроде двойника во вход, вместо выходного сообщения об исключении, он дает мне:
Exception in thread "main" java.lang.NumberFormatException: For input string: "1.2"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at reviewGUI.NChooseR.main(NChooseR.java:32)
Я заметил, что многие другие InputMismatchExceptions используют сканеры вместо DataInputStream, нужно ли мне изменить его на этот формат, чтобы он работал? Вот часть моего кода:
public static void main(String[] args) throws IOException {
DataInputStream input = new DataInputStream (System.in);
int numChosenObj = -1;
int numTotalObj=-1;
try
{
System.out.print("Enter the number of objects to choose: ");
numChosenObj = Integer.parseInt(input.readLine());
}
catch(InputMismatchException e)
{
System.out.println("You must input an integer value.");
}
try
{
System.out.print("Enter the total number of objects to choose from: ");
numTotalObj = Integer.parseInt(input.readLine());
}
catch(InputMismatchException e)
{
System.out.println("You must input an integer value.");
}
int difference = numTotalObj-numChosenObj;
int rFact = factorial(numChosenObj);
int nFact = factorial(numTotalObj);
int differenceFact = factorial(numTotalObj-numChosenObj);
int totalWaysToChoose = nFact/(rFact*differenceFact);
System.out.println();
System.out.println("There are " + totalWaysToChoose + " ways to choose " + numChosenObj + " objects from " + numTotalObj + " total number of objects.");
}
Вы просто поймали неправильное исключение. Согласно сообщению, это NumberFormatException, а не InputMismatchException.
@FedericoklezCulloca есть способ исправить это? Я не думаю, что когда-либо сталкивался с этим раньше
Ничего не нужно исправить, кроме правильного исключения.
@FedericoklezCulloca Хорошо, спасибо. Так что я немного запутался, потому что думал, что NumberFormatException перехватит, только если будет введена строка? Но я также хотел бы поймать, вводится ли двойное значение.




Основная проблема заключается в том, что input.readLine() не будет генерировать InputMismatch, так как там есть строка, вы не можете ее иметь (если строки нет, метод readLine() просто подождет, пока она не появится, или вернет null, если поток закрыто). InputMismatch возникает только в том случае, если вы запрашиваете какой-то конкретный тип данных, например, int, please.
Integer.parseInt, если переданная строка не является int, вызовет исключение NumberFormatException, а не InputMismatchException.
Прямое исправление - вместо этого перехватить NumberFormatException. Но вы сделали этот код намного сложнее, чем нужно.
Scanner s = new Scanner(System.in);
s.useDelimiter("\\R"); // the enter key delimits.
System.out.print("Enter the number of objects to choose: ");
numChosenObj = s.nextInt();
System.out.println("Enter your name: ");
name = s.next();
NB: никогда не вызывайте scanner.nextLine. Он «сломан» (он делает то, что говорит api, но это не то, что вы думаете). Чтобы прочитать строку, позвоните в .next(). Это работает из-за правильной установки разделителя. Забудьте о DataInputStream.
Теперь, если вы хотите напечатать что-то индивидуальное, я бы вместо этого сделал метод:
public int askForInt(Scanner s, String prompt) {
while (true) {
try {
System.out.print(prompt);
return s.nextInt();
} catch (InputMismatchException e) {
System.out.println("An integer number is required.");
}
}
}
теперь вы можете вызвать в askForInt(s, "Enter the number of objects to choose: "), и он спросит, и продолжайте спрашивать, пока пользователь что-то не введет.
Каждый раз, когда у вас есть тенденция копировать / вставлять код, вы всегда должны думать: Хммм, есть ли очевидная особая цель у кода, который я копирую? Если да, предложите метод.
class App {
public static void main(String[] args) throws Exception {
new App().go(); // your main should always be a one-liner, really.
}
public void go() throws Exception {
Scanner s = new Scanner(System.in);
s.useDelimiter("\\R");
int numChosenObj = askInt(s, "Enter the number of objects to choose: ");
int numTotalObj = askInt(s, "Enter the total number of objects to choose from: ");
int difference = numTotalObj-numChosenObj;
int rFact = factorial(numChosenObj);
int nFact = factorial(numTotalObj);
int differenceFact = factorial(numTotalObj-numChosenObj);
int totalWaysToChoose = nFact/(rFact*differenceFact);
System.out.println();
System.out.println("There are " + totalWaysToChoose + " ways to choose " + numChosenObj + " objects from " + numTotalObj + " total number of objects.");
}
private int askInt(Scanner s, String prompt) {
while (true) {
System.out.print(prompt);
try {
return s.nextInt();
} catch (InputMismatchException e) {
System.out.println("An integer number is required.");
}
}
}
}
Выглядит намного чище, не так ли?
Не имеет отношения, но
readLineустарел.