[Java扫描仪需要帮助hasNext()hasNextInt()hasNextDouble()方法

问题描述 投票:0回答:1

我编写了此脚本,该脚本接受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()似乎可以正常工作。我不明白我犯了什么错误。我需要你的帮助。

java java.util.scanner
1个回答
0
投票
能否请您描述下一次遇到的问题。

我将假设您遇到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是什么。

© www.soinside.com 2019 - 2024. All rights reserved.