【问题标题】:Populating Array from File input从文件输入填充数组
【发布时间】:2016-11-14 21:16:26
【问题描述】:

我正在开发一个口袋妖怪战斗模拟器(基本上是 pokemonshowdown gen1),试图自动制作口袋妖怪阵列,但遇到了扫描仪问题。文件格式为:Name.Type1.Type2.hp.attack.defense.special.speed.list of learnable move。所以: Aerodactyl.Flying.Rock.80.105.65.60.130.Agility,Bide,Bite,Double-Edge,Double Team,Dragon Rage,Fire Blast,Fly,Hyper Beam,Mimic,Rage,Razor Wind,Reflect,Rest,Sky Attack,替补,超音速,迅捷,击倒,毒,翼攻击。

我已经获得了一种适用于我的 typeArray 和 moveArray 的方法,但由于某种原因,使用基本相同的循环,扫描仪返回的是空令牌而不是文件中的内容。

例外:

0   Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at Controller.initPokemonArray(Controller.java:169)
at Controller.<init>(Controller.java:29)
at Driver.main(Driver.java:15)

这是整个方法,它在 parseInt 调用 hp 时抛出错误。

    private Pokemon[] initPokemonArray() {
    Pokemon[] pokemonArray = new Pokemon[83];
    try {
        Scanner inputScan = new Scanner(new File("src/pokemon")).useDelimiter(".");
        String name = "";
        Type type1 = typeArray[0];
        String inputType1 = "";
        Type type2 = typeArray[0];
        String inputType2 = "";
        int hp = 0;
        int atk = 0;
        int def = 0;
        int spc = 0;
        int spe = 0;
        String[] lm = {};
        Move[] learnableMoves;
        int counter = 0;
        while (counter < 83) {
        System.out.print(counter);
            if (inputScan.hasNextLine()) {
                name = inputScan.next();
                System.out.println(name+" ");
                //System.out.print("name");
                inputType1 = inputScan.next();
                for (int i = 0;i < 16;i++)
                    if (inputType1.equals(typeArray[i].toString()))
                        type1 = typeArray[i];
                System.out.println(type1.toString()+" ");
                inputType2 = inputScan.next();
                for (int i = 0;i < 16;i++)
                    if (inputType2.equals(typeArray[i].toString()))
                        type2 = typeArray[i];
                System.out.println(type2.toString()+" ");
                hp = Integer.parseInt(inputScan.next());
                System.out.println(hp+" ");
                atk = Integer.parseInt(inputScan.next());
                System.out.println(atk+" ");
                def = Integer.parseInt(inputScan.next());
                System.out.println(def+" ");
                spc = Integer.parseInt(inputScan.next());
                System.out.println(spc+" ");
                spe = Integer.parseInt(inputScan.next());
                System.out.println(spe+" ");
                lm = inputScan.next().split(",");
                System.out.println();
            }
            //TODO move this to private helper method
            learnableMoves = new Move[lm.length];
            for (int i = 0;i < 160;i++) {
                for (int j = 0;j < lm.length;j++) {
                    if (lm[j] == moveArray[i].getName())
                        learnableMoves[j] = moveArray[i];
                }
            }
            pokemonArray[counter] = new Pokemon(name,type1,type2,hp,atk,def,spc,spe,learnableMoves);
            counter++;
        }
        inputScan.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return pokemonArray;
}

免责声明:这是我的 java 2 课程的一个项目,也是我在这里的第一篇文章,所以我不知道我应该做什么,所以只是在这里公布。

【问题讨论】:

  • 它抛出了什么错误?
  • "在 parseInt 调用 hp 时出错" -- 什么样的错误?它发生在每一行还是特别是某些行?如果您包含导致问题的src/pokemon 的一部分,将会很有帮助。
  • 只要你有一个具体的问题,不只是在寻找其他人来写,如果你没问题的话。尝试先将 inputScan.next() 保存到 String 变量中并打印它。您可能正在挑选一个空间或其他东西。还要查看 inputScan.nextInt()。
  • 显示实际的整个输入(从程序开始直到错误发生)。
  • 体面的问题。请提供错误本身的文本。在不相关的注释中,您应该真正将代码分解为方法,而不是像这样拥有一大块文本。除其他外,它会更容易阅读。

标签: java arrays java.util.scanner


【解决方案1】:

useDelimiter() 方法将传递的字符串作为正则表达式值。https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#useDelimiter-java.lang.String-。句号在正则表达式中具有特定含义。获取特定字符“。”用这个。

Scanner inputScan = new Scanner(new File("src/pokemon")).useDelimiter("\\.");

【讨论】:

  • 谢谢!这似乎是问题所在。不知道正则表达式和句点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2018-05-22
  • 1970-01-01
相关资源
最近更新 更多