- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简介
我在捕获 InputMismatchException
时遇到问题。当我搜索 InputMismatchException
时,我已经阅读了该网站上出现在第一页上的所有线程。我在阅读这些帖子时找到了我的一个问题的答案;这个答案告诉我必须在导入语句中添加 import java.util.InputMismatchException; 。但是我遇到了一个不同的问题,我无法找到任何解决方案。最接近的其他问题是 this one 。我认为他和我有同样的问题,但该解决方案对我不起作用。
我的问题
我正在创建一个类来演示我创建的 ProductionWorker 数据类型。我想测试所有输入,以确保它们是可以按预期进行操作的有效输入。我正在尝试获得工资率的双倍输入,如果输入错误,我希望被要求再次尝试输入;假设我不小心输入了“gary”而不是我的工资。我认为 try-catch-finally 可以工作,但进入 catch block 后我仍然得到 InputMismatchException...
控制台输出
run:
What is your name: gary
Please enter employee number: 88-m
Incorrect employee ID, please check it and try again.
Enter employee number: 888-m
Please enter hire date as "MM/DD/YYYY": 07/14/1994
Please enter shift (1 for day shift, 2 for night shift.: 2
Please enter rate of pay: $h
Rate of pay can only be digits.
Exception in thread "main" java.util.InputMismatchException
Examples: 30.00; 22.10; 7.25; 10.00
at java.util.Scanner.throwFor(Scanner.java:864)
Please enter rate of pay: $ at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at programmingchallengeq1.ProgrammingChallengeQ1.main(ProgrammingChallengeQ1.java:69)
Picked up _JAVA_OPTIONS: -Xmx512m
C:\Users\nikru\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 15 seconds)
在我看来,因为 print 语句显示在控制台中,所以我将其放入了 catch block ,并且我认为如果将其放入 catch block ,异常就不会导致程序崩溃。我不知道我做错了什么...
代码
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package programmingchallengeq1;
import java.util.Scanner;
import java.util.regex.*;
import java.util.InputMismatchException;
public class ProgrammingChallengeQ1 {
public static void main(String[] args)
{
Scanner kb = new Scanner(System.in);
final int SHIFT_LENGTH = 12;
ProductionWorker workman = new ProductionWorker();
System.out.print("What is your name: ");
workman.set_name(kb.nextLine());
System.out.print("Please enter employee number: ");
// ask user for id and save it to workman
workman.set_id(kb.nextLine());
// while loop ensures that employee num matches specific format
while (check_id(workman) == false)
{
System.out.print("Incorrect employee ID, please check it and" +
" try again.\n" + "Enter employee number: ");
workman.set_id(kb.nextLine());
}
System.out.print("Please enter hire date as \"MM/DD/YYYY\": ");
// ask user for date of hire and save it to workman
workman.set_hire_date(kb.nextLine());
// attempt to ensure a valid date was input with while loop
while(check_date(workman) == false)
{
System.out.println("Date not recognized, please check date" +
" and try again.\n" + "Enter hire date as \"MM/DD/YYY\": ");
workman.set_hire_date(kb.nextLine());
}
System.out.print("Please enter shift (1 for day shift, 2 for night"+
" shift.: ");
workman.set_shift(kb.nextInt());
// the while loop checks if a correct value is stored for shift
while(workman.get_shift() != 1 && workman.get_shift() != 2)
{
System.out.print("Unrecognized shift. Please enter a 1 for" +
" day shift, or 2 for night shift: ");
workman.set_shift(kb.nextInt());
}
System.out.print("Please enter rate of pay: $");
// attempt to ensure a valid rate of pay is input with try-catch
// boolean is the exit condition for while loop, which only breaks
// if the input is valid
boolean valid_input = false;
while (valid_input != true)
{
try
{
workman.set_pay_rate(kb.nextDouble());
valid_input = true;
}
catch(InputMismatchException ex)
{
//System.out.println(ex.getMessage());
System.out.print("Rate of pay can only be digits.\nExamples:" +
" 30.00; 22.10; 7.25; 10.00\nPlease enter rate of pay: $");
}
finally
{
workman.set_pay_rate(kb.nextDouble());
}
}
}
public static boolean check_id(ProductionWorker wrkr)
{
// creating a regex pattern to check against input employee ID
// to avoid inputting error
String id_format = "\\d{3}-[a-m]";
Pattern id_pattern = Pattern.compile(id_format);
// check id against compiled regex pattern and save to a bool
Matcher id_matcher = id_pattern.matcher(wrkr.get_id());
boolean id_matches = id_matcher.matches();
return id_matches;
}
public static boolean check_date(ProductionWorker wrkr)
{
//same concept as in check_id()
String date_format = "\\d{2}/\\d{2}/\\d{4}";
Pattern date_pattern = Pattern.compile(date_format);
Matcher date_matcher = date_pattern.matcher(wrkr.get_hire_date());
boolean date_matches = date_matcher.matches();
return date_matches;
}
}
感谢所有帮助,谢谢!
最佳答案
您也在finally
block 中运行nextDouble()
,因此无论发生什么情况此时都会失败。基本上,失败的第一个调用不会消耗数据,因此第二个调用不会等待新的用户输入,它会立即尝试消耗已经存在的输入并再次失败。
您必须显式使用该行来解决此问题:
Scanner sc = new Scanner(System.in);
try {
sc.nextDouble();
} catch (InputMismatchException e) {
System.out.println("Oops, something went wrong...");
sc.nextLine();
sc.nextDouble();
}
我删除了 finally
block ,因为我不明白为什么在第一次尝试成功时您还想重试该操作。
关于java - InputMismatchException 被捕获后导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450075/
这个问题已经有答案了: Scanner double value - InputMismatchException (2 个回答) 已关闭2 年前。 为什么 Java 在使用 Scanner.next
我正在实现一个驱动程序来测试决策树,但遇到输入不匹配异常。我可以做什么来解决这个问题? 这是我的代码: import java.io.FileNotFoundException; /** * Loa
static long arrayMaxMin[]; public static void main(String[] args) { try{ Scanner in = new
这个问题在这里已经有了答案: Scanner is skipping nextLine() after using next() or nextFoo()? (23 个回答) 5年前关闭。 impor
简介 我在捕获 InputMismatchException 时遇到问题。当我搜索 InputMismatchException 时,我已经阅读了该网站上出现在第一页上的所有线程。我在阅读这些帖子时找
while(inputbook.hasNext()){ id = inputbook.nextInt(); name = inputbook.next(); year = in
我有这个代码: import java.util.Scanner; public class Maggiore3Valori { public static void main(String[
public static void main(String[] args) { try { Scanner scan = new Scanner(new Fi
当输入 55.5 作为第一个提示的答案时,我收到以下错误。输入 50 时我没有收到错误消息。 Exception in thread "main" java.util.InputMismatchExc
为什么我遇到了 inputMismatchException?当输入仅为整数时,结果会很好,但是当我使用双输入时,编译器会抛出 inputMismatchException。 public stati
我有一个任务: 5-8)(求最高分)编写一个程序,提示用户输入学生人数以及每个学生的姓名和分数,最后显示分数最高的学生的名字。 当我运行此代码并输入“john”等名称时,它运行良好,但当我尝试输入“J
我尝试以最简单的方式使用扫描仪: 代码: double gas, efficiency, distance, cost; Scanner scanner = new Scanner(System.in
我试图提示用户输入 x 坐标,但是当我输入十进制数(例如 2.1)作为输入时,这会导致问题。如何解决该问题? import java.util.Scanner; public cl
所以我一直在做一项任务,要求我们建立一个“患者经理”,根据紧急级别确定首先治疗的患者。我遇到的主要问题是,当用户在紧急栏中输入数字以外的内容时,它会使程序崩溃并给我一个 InputMismatchEx
public static void main(String[] args) throws FileNotFoundException { File file = new File("data
我写了下面这段Java代码。当运行它并输入任何值(定义的值,例如 latte,或任何其他值,例如 az 整数)时,我得到一个 InputMismatchException。 据我所知,此异常意味着输入
我希望用户输入一行文本,只要 x 不等于 numOfContestans 的值。当我运行代码时,我收到一个 InputMismatchException。有人知道如何解决这个错误吗? try {
这个问题已经有答案了: Scanner is skipping nextLine() after using next() or nextFoo()? (25 个回答) 已关闭 7 年前。 我有文本文
我无法找到错误的根源。我所做的就是从文件中读取文本 public static void main(String[] args) throws Exception { int T; S
我在将非整数输入整数字段时遇到问题。我只是采取预防措施,这样如果其他人使用/处理我的程序,他们就不会得到此 InputMismatchException。 当我在 input 变量中输入非数字字符时,
我是一名优秀的程序员,十分优秀!