gpt4 book ai didi

java - 扩展 java.util.Scanner

转载 作者:行者123 更新时间:2023-12-02 07:46:47 27 4
gpt4 key购买 nike

假设我想向扫描仪添加一个名为 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com