Java 在系统检查异常之前,如何允许输入三个整数,后跟一个空格和一个单词?

Java 在系统检查异常之前,如何允许输入三个整数,后跟一个空格和一个单词?,java,exception,exception-handling,Java,Exception,Exception Handling,这是一个家庭作业,我为这个愚蠢的问题道歉,我似乎无法破解它,我已经尝试了一些方法,包括.hasInt()。我的代码用于检查用户是否正在输入整数。在我希望允许用户输入“5小时10分钟15秒”后,buy将不允许任何操作。到目前为止,我只能允许他们输入“5 10 15”,其他任何东西都会被异常捕获,并要求他输入有效的数字。这是代码 import java.util.*; public class TimetoSeconds { public static void main(String[] arg

这是一个家庭作业,我为这个愚蠢的问题道歉,我似乎无法破解它,我已经尝试了一些方法,包括
.hasInt()。我的代码用于检查用户是否正在输入整数。在我希望允许用户输入
“5小时10分钟15秒”后,buy将不允许任何操作。到目前为止,我只能允许他们输入
“5 10 15”
,其他任何东西都会被异常捕获,并要求他输入有效的数字。这是代码

import java.util.*;

public class TimetoSeconds
{
public static void main(String[] args)
{
    System.out.println("Time converter");
    System.out.println();
    //start scanner and variables
    Scanner sc = new Scanner(System.in);
    int x = 60;
    String choice = "y";
    while (choice.equalsIgnoreCase("y"))
    {
        //catch exceptions
        int hours = 0;
        int minutes = 0;
        int seconds = 0;
        try
        {
        // get user input
        System.out.print("Enter time in hours (space), minutes (space), and
                    seconds:  ");
        hours = sc.nextInt();
        minutes = sc.nextInt();
        seconds = sc.nextInt();
        System.out.println();
        }
        catch (InputMismatchException e)
        {
            sc.nextLine();
            System.out.print("Error! Invalid number. Try again.\n");
            continue;
        }

        int sec1 = (hours * x) * x;
        int sec2 = minutes * x;
        int totalSec = sec1 + sec2 + seconds;

        System.out.print("Total seconds are:  " + totalSec + "\n");
        System.out.println();

        System.out.print("Continue? (y/n):   ");
        choice = sc.next();
        System.out.println();
    }
}
}
把这部分换一下

    System.out.print("Enter time in hours (space), minutes (space), and seconds:  ");
    hours = sc.nextInt();
    sc.next();
    minutes = sc.nextInt();
    sc.next();
    seconds = sc.nextInt();
    sc.next();
那么你的程序工作正常

Time converter

Enter time in hours (space), minutes (space), and seconds:  5 hours, 10 minutes, 12 seconds

Total seconds are:  18612

Continue? (y/n):   y

Enter time in hours (space), minutes (space), and seconds:  3 hours, 10 minutes, 20 seconds

Total seconds are:  11420

Continue? (y/n):   n
但这很容易出错。我宁愿读整个大字符串
用户输入的时间,例如“5小时、10分钟、20秒”,然后
从那里提取我需要的任何东西(我只需要3个数字)。
什么是容易出错的?因为如果用户键入“5小时10分钟20秒”,

它仍然会将此检测为无效输入(因为逗号没有粘在单词上)。

您可以使用
nextLine
读取整个字符串,然后使用
split
获取数字:

    System.out.print("Enter time in hours (space), minutes (space), and seconds:  "); 
    String line = sc.nextLine();
    String values[] = line.trim().split("[^0-9]+");

split
的参数是正则表达式;它将一个或多个非数字的任何序列视为分隔符,并返回分隔符之间的子字符串。因此,
values[]
的所有元素都将是只有数字的字符串(除了
values[0]
可以是空字符串),您可以使用
Integer.parseInt
获取实际整数。您还可以轻松地检查以确保他们输入了正确的整数数
trim()
只需去掉前导空格和尾随空格,这样如果它们输入
“5 10 15”
,它仍然可以工作。(但如果他们输入
“给我5,10,15”
值[0]
将是
值[1]
将是
“5”
,等等)这种解决方案不会让用户像使用扫描仪的
下一步那样在单独的行中输入数字。如果需要在单独的行上输入,则如果不使用循环和一些额外的逻辑,上述解决方案将无法工作。

可能使用
StringTokenizer
。是指向java api中stringtokenizer的链接


它允许您定义分隔符并获取这些分隔符拆分的子字符串。

您的问题是什么?请记住,数字是整数,单词是字符串。如果你告诉它你想要接受整数,你只能得到它们。你需要接受一个字符串并对其进行解析。你已经学习了正则表达式吗?请给出一些关于你的问题到底是什么的信息。你想让用户做什么,不想做什么?他应该能进入“10分钟”吗?它应该只过滤掉“10”吗?或者它还应该计算它的秒数吗?它应该计算所有的整数并省略单词。所以,是的,它应该只过滤掉单词。不,我还没有学过正则表达式。好的,是的,它工作得很好。所以我猜这个概念是省略数字后面的任何其他字符串,对吗?但它怎么仍然容易出错呢?我不太确定我是否明白这个解释。它在每个数字之间省略了一个字符串。这很容易出错,因为用户可能会在那里键入两个字符串,正如我用逗号显示的那样。