我编写了此脚本,该脚本接受Scanner的输入并创建2个表,一个表用于数据基元类型,另一个表用于与每种类型关联的值:
例如:我们有这样的输入
new Scanner("3 double 0.0 String xyz int -5")
并作为输出:
[double.class, String.class, int.class]
[0.0, "xyz", -5]
我所做的是这:
public class TraitementBuilder {
Class<?> analyserType(String nomType) throws ClassNotFoundException {
String input = nomType.toUpperCase().charAt(0) + nomType.substring(1);
Class<?> classe = Class.forName(input);
return classe;
}
static Object decoderEffectif(Class<?> formel, Scanner in) {
if (Integer.class.isInstance(formel))
return in.nextInt();
else if (Double.class.isInstance(formel))
return in.nextDouble();
else if (String.class.isInstance(formel))
return in.next();
else
return null;
}
static private class Signature {
Class<?>[] formels;
Object[] effectifs;
public Signature(Class<?>[] formels, Object[] effectifs) {
this.formels = formels;
this.effectifs = effectifs;
}
}
Signature analyserSignature(Scanner in) throws ClassNotFoundException {
int inputTaille = in.nextInt();
Class<?>[] formels = new Class<?>[inputTaille];
Object[] effectifs = new Object[inputTaille];
Map<String, Class> builtInMap = new HashMap<String, Class>();
{
builtInMap.put("int", Integer.TYPE);
builtInMap.put("double", Double.TYPE);
}
String input;
int countFormel = 0;
int countE = 0;
while (in.hasNext()) {
if (in.hasNextDouble()) {
effectifs[countE] = decoderEffectif(formels[countE], in);
countE++;
}
else if (in.hasNextInt()) {
effectifs[countE] = decoderEffectif(formels[countE], in);
countE++;
} else {
input = in.next();
if (builtInMap.containsKey(input)) {
formels[countFormel] = builtInMap.get(input);
countFormel++;
} else {
formels[countFormel] = analyserType(input);
effectifs[countE] = decoderEffectif(formels[countFormel], in);
countE++;
countFormel++;
}
}
}
return new Signature(formels, effectifs);
}
public static void main(String[] args) {
TraitementBuilder builder = new TraitementBuilder();
try {
builder.analyserSignature(new Scanner("3 double 0.0 String xyz int -5"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
但是似乎hasNextInt()和hasNextDouble()不能正常工作,只有hastNext()似乎可以正常工作。我不明白我犯了什么错误。我需要你的帮助。
我将假设您遇到ArrayIndexOutOfBoundsException错误。
您的代码很乱,所以我只解决ArrayIndexOutOfBoundsException,您将在一行中遇到更多错误。
首先创建2个大小为inputTaille
的数组,这些数组等于3(代码中的第一个int)
现在,您的代码将循环通过while循环,在每个循环中将项目添加到数组中,并将计数器增加1。当计数器达到3时,数组formels []或effectifs中将没有任何空间。 ],因为其中只有3个点[0,1,2] ....因此,为什么要获取ArrayIndexOutOfBoundsException。
修复ArrayIndexOutOfBoundsException后出现的错误是,由于decoderEffectIf
,当下一个字符为int或boolean时,您将陷入无限循环中>
static Object decoderEffectif(Class<?> formel, Scanner in) {
if (Integer.class.isInstance(formel))
return in.nextInt();
else if (Double.class.isInstance(formel))
return in.nextDouble();
else if (String.class.isInstance(formel))
return in.next();
else
return null;
}
此代码将始终返回null,因为您正在使用decoderEffectif(formels[countE], in)
调用解码器,但表格仅包含[null,null,null](由于某种原因,您仅在具有字符串的情况下才向表格中添加内容),因此您'将始终检查Int或Double是否为null实例,显然每次都为false。
您的代码使我头疼,因为它很难阅读,在修复这些错误之后,您可能会遇到更多错误,我将尝试重组代码以使下一次阅读更加容易。目标应该是尝试使其尽可能简单。一旦您看到类似static Object decoderEffectif(Class<?> formel, Scanner in)
的函数,您就会知道您在某个地方出错,因为如果没有注释,除非他们花费数小时来查看所有代码,否则没有人会知道formel是什么。