java - 扩展 java.util.Scanner

标签 java exception java.util.scanner extends

假设我想向扫描仪添加一个名为 nextPositiveInt() 的方法类似于 nextInt()除了当检测到负整数时,自定义 InputNegativeException被抛出。

当有solutions that utilise时我为什么要这样做hasNextInt() ?虽然不太简洁,但考虑到异常的目的,它看起来更整洁、更符合逻辑。例如:

扩展扫描仪方法:

Scanner cli = new Scanner(System.in);
boolean inputValid = false;

do
{
    System.out.println("Enter your age:");
    try
    {
        int age = cli.nextPositiveInt();
    }
    catch(InputNegativeException e)
    {
        System.out.println("You cannot specify a negative age.");
        inputValid = false;
    }
    catch(InputMismatchException e)
    {
        System.out.println("Your input must be numeric.");
        inputValid = false;
    }
} while(!inputValid);

<强> hasNext()方法:

Scanner cli = new Scanner(System.in);

do
{
    System.out.println("Please enter a positive number!");
    while(!sc.hasNextInt())
    {
        System.out.println("That's not a number!");
        sc.next(); // this is important!
    }
    int number = sc.nextInt();
} while(number <= 0);

因此,假设您还没有做出回应,告诉我为什么这是一个非常糟糕的主意(如果是,请这样做;我想可能有人反对在扫描仪中进行验证)我很困惑去做这件事。我想我需要复制nextInt()的主体在nextPositiveInt()有一些小的改变?你甚至可以获取 nextInt() 的正文吗?任何地方?

很抱歉,我没有代码来显示我所做的任何努力,但我不知道从哪里开始。

最佳答案

尽管 Scanner 类是最终的并且您无法扩展它,但存在另一种解决方案。您可以使用Delegation pattern .

此外,由于 Scanner 类具有所有必要的方法,您可以轻松复制原始方法并进行一些更改。请参阅 Scanner 类的源代码,您唯一应该更改的是用于匹配字符串的正则表达式,以排除负整数。

扫描仪源代码:

public int nextInt() {
    return nextInt(defaultRadix);
}

public int nextInt(int radix) {
    // Check cached result
    if ((typeCache != null) && (typeCache instanceof Integer)
    && this.radix == radix) {
        int val = ((Integer)typeCache).intValue();
        useTypeCache();
        return val;
    }
    setRadix(radix);
    clearCaches();
    // Search for next int
    try {
        String s = next(integerPattern());
        if (matcher.group(SIMPLE_GROUP_INDEX) == null)
            s = processIntegerToken(s);
        return Integer.parseInt(s, radix);
    } catch (NumberFormatException nfe) {
        position = matcher.start(); // don't skip bad token
        throw new InputMismatchException(nfe.getMessage());
    }
}

您应该只更改:

String s = next(integerPattern());

出于您的目的,您可以对正则表达式进行硬编码。原始正则表达式可以很容易地在调试中捕获。

就实现而言,它肯定不是最好的解决方案 - 需要编写大量代码并进行大量复制粘贴,但它会很容易且易于使用。

关于java - 扩展 java.util.Scanner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10715009/

相关文章:

java - 是否可以为 JLabel 中的 ImageIcon 制作选择工具?

java - 如何按内部类列表的收集器分组?

java - 如何在多个不同的对象上调用相同的刻度方法?

c++ - 如何在线程之间传播异常?

c++ - 为什么 boost::property_tree::read_xml 抛出读取有效的 Office Open XML?

python - 处理除一个异常外的所有异常

java - 确定文本文件长度的最有效方法是什么?

java - getNodeName、getLocalName 未返回预期值

java - Java输入编译错误

java - 问题 : Reading 10 different marks into my marks variable. FOR 循环