java怎么判断scanner输入的数据类型

java怎么判断scanner输入的数据类型,
是int还是double

这种功能有多种实现方法。最简单的就是使用try-catch结构,通过捕捉各类异常,从而判断用户输入的类型。这里给出一个代码实现

package help.Scanner;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入测试内容");
        try { 
            in.nextInt();
            System.out.println("Int类型");
        } catch (InputMismatchException e) {
            System.out.println("Double类型");
        }
    }
}

在这里。我们假设用户只会输入int或double类型的值。当然实际应用的时候绝大数用户是不会那么做的。这里给出的代码迎合了一种假想的理想环境。即用户永远只会输入int或double类型的值。这是最简单的一种情况。来看运行结果:

img


可以看到。成功判断出来了。这是因为,当用户输入int值后,nextInt不会抛出异常。catch语句也就监测不到异常。从而打印另外一种语句。不过这个代码并不完美。因为如果用户输入其他类型的数据代码也照样说这是double类型。不过我们这个程序是在假想环境下运行的。即用户只会输入int或double类型的值。大部分学习的例子都是在这一环境下运行的。如果你去深究,你会发现他们并不完美。不过这里只是举个例子。
如果我们加几行代码。让他捕捉一下代码运行所造成的时间消耗。

img


以下是在i5 6200u处理器和12GB内存(运行Windows10 x64)下的代码与运行结果:

img


img


可以看到。try确实实现这个功能比较容易,如果用户输入的是Int类型,那好说,不会触发catch子句,所带来的开销就几乎是0。但是如果用户输入了double类型的数据,那么就会触发catch句,虽然98毫秒这个数值可能并不准确而且currentTimeMillis方法甚至可能会受到系统影响(我们后面的代码使用了更精确的Date类)。由于这个数据同时受到用户输入的影响。在我费劲力气尝试出了一个最小值作为这篇回答的结果,但是毫无疑问,一旦触发catch结构,那么带来的开销就不可能为0。既然话都说到这了。我们不妨研究一下如何用最少的开销完成这个并不怎么重要的功能。毕竟如果你的项目中真的需要这个功能。你肯定想用最少的开销来解决问题。所以这里我们就来研究研究这个问题
很明显,如果利用方法本身所抛出的异常来判断。那么这种做法肯定是不划算的。那么我们不如用一个用户不太可能抛出异常的方法来接收用户的数据。然后进行对比。对比所产生的开销可比try语句开销少多了。这里给出一个代码实现

package help.Scanner;

import java.util.Date;
import java.util.Scanner;

public class Test
{
    public static void main(String[] args) throws InterruptedException {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入测试内容");

        String userIn = in.nextLine();
        Date start = new Date();

        for (int i = 0;i < userIn.length();i++)
        {
            if (userIn.charAt(i) == '.')
            {
                System.out.println("Double类型");
                break;
            }
        }
        System.out.println("Int类型");

        Date end = new Date();
        System.out.println("花费时间" + (end.getTime() - start.getTime()) + "毫秒");
    }
}

来看运行结果

img


很明显,这个算法所造成的时间开销比catch执行时造成的时间开销少了许多。那么可不可以有其他的优化方案呢?答案是可以的,在这里,我们再给出一种算法。第一种算法是靠看方法是否抛出异常,第二中方法是看用户输入的内容里是否有小数点。接下来,我们利用小数的强制类型转换产生的差异再写一种算法

package help.Scanner;

import java.util.Date;
import java.util.Scanner;

public class Test
{
    public static void main(String[] args) throws InterruptedException {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入测试内容");

        String userIn = in.nextLine();
        Date start = new Date();
        double userNI = Double.parseDouble(userIn);
        if (String.valueOf((int)userNI).equals(userIn)) System.out.println("Int类型");
        else System.out.println("Double类型");

        Date end = new Date();
        System.out.println("花费时间" + (end.getTime() - start.getTime()) + "毫秒");
    }
}

接下来是这个算法的执行时间

img


可以看到。执行时间与算法2差不多。但是无论是算法2还是算法3,他们都尽可能减少了两种情况的耗时。直接使用try会使得两种情况下使用时间并不均匀。因为执行catch与不执行catch的资源消耗是不一样的。当然应该还会有其他方法。欢迎指出我的回答中某些不对的地方qwq

输入的类型,你自己要先清楚,再定义对应的类型方法去接收。

//输入整数
scanner.nextInt();
//输入字符串
scanner.next();

不知道什么类型的话,就直接用字符串类型来输入scanner.next();只要不参与四则运算就没关系,如果需要进行四则运算,再转为对应的类型即可。


scanner.nextInt();
scanner.nextDouble();

用字符串形式输入,自己写判断的代码

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632