繁体   English   中英

启动我的程序时出错,我该如何解决?

[英]Error launching my program, how can i fix it?

我的大学有这个作业https://cs1331.gitlab.io/fall2018/hw2/hw2-source-model.html 我写了代码,但是当我运行程序时,我在控制台收到此消息:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 2
    at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3107)
    at java.base/java.lang.String.substring(String.java:1873)
    at homework1.SourceModel.main(SourceModel.java:127)

这是我的此作业的代码,并带有注释:

 package homework1;

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;


public class SourceModel {

    //initialize variables so they can be accessed everywhere
    private String modelName;
    private int[][] characterCount;
    private double[] rowCount;
    private double[][] probability;

    /**
     * 
     * @param name takes the name of the corpus
     * @param fileName takes the filesName of corpus
     */
    public SourceModel(String name, String fileName) {
        modelName = name;
        characterCount = new int[26][26];
        rowCount = new double[26];
        probability = new double[26][26];
        System.out.println("Training " + name + "model...");

        try {
            Scanner scan = new Scanner(new File(fileName));
            String temp = "";

            //append all of the text
            while (scan.hasNext()) {
                temp += scan.next();
            }

            //only keeps the letters and makes them lowercase
            temp = temp.replaceAll("[^A-Za-z]+", "").toLowerCase();
System.out.println(temp);
            //iterates trough each letter then puts the letters
            //sequence to the respective row and column

            for (int i = 0; i < (temp.length() - 1); i++) {
                char firstLetter = temp.charAt(i);
                char secondLetter = temp.charAt(i + 1);

                //index based on ASCII values
                characterCount[(int) firstLetter - 97][(int) secondLetter - 97]++;
                rowCount[(int) firstLetter - 97]++;
            }

            //calculates the probability by dividing the count
            //by the total counts in each row 
            for (int i = 0; i < probability.length; i++) {
                for (int j = 0; j < probability[i].length; j++) {
                    if (rowCount[i] == 0) {
                        rowCount[i] = 0.01;
                    }
                    probability[i][j] = (((double) characterCount[i][j]) / rowCount[i]);

                    if (probability[i][j] == 0) {
                        probability[i][j] = 0.01;
                    }
                }
            }
            System.out.println("done");

        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 
     * @return a string which contains the name
     */
    public String getName() {
        return modelName;
    }

    /**
     * @return a string with the matrix 
     */
    public String toString() {
        String matrix = "";
        matrix += "";
        for (int i = 97; i < 123; i++) {
            matrix += "  ";
            matrix += (char) i;
        }
        matrix += ("\n");
        for (int i = 0; i < probability.length; i++) {
            matrix += ((char) (i + 97) + " ");
            for (int j = 0; j < probability[i].length; j++) {
                matrix += String.format("%.2f", probability[i][j]);
                matrix += ("");
            }
            matrix += "\n";
        }
        return matrix;
    }

    /**
     * 
     * @param test a set of letters to test
     * @return the probability for the word 
     */
    public double probability(String test) {
        test = test.replaceAll("[^A-Za-z]+", "").toLowerCase();
        double stringProbability = 1.0;
        for (int i = 0; i < test.length() - 1; i++) {
            int firstIndex = (int) (test.charAt(i)) - 97;
            int secondIndex = (int) (test.charAt(i + 1)) - 97;
            stringProbability *= probability[firstIndex][secondIndex];
        }
        return stringProbability;
    }

    /**
     * 
     * @param args the command line arguments 
     */
    public static void main(String[] args) {
        SourceModel[] models = new SourceModel[args.length - 1];
        for (int i = 0; i < args.length - 1; i++) {
            models[i] = new SourceModel(args[i].substring(0, args[i].indexOf(".")), args[i]);
        }
        System.out.println("Analyzing: " + args[args.length - 1]);
        double[] normalizedProbability = new double[args.length - 1];
        double sumProbability = 0;
        for (int i = 0; i < args.length - 1; i++) {
            sumProbability += models[i].probability(args[args.length - 1]);
        }
        //normalize the probability in respect to the values given
        for (int i = 0; i < normalizedProbability.length; i++) {
            normalizedProbability[i] = models[i].probability(args[args.length - 1]) / sumProbability;
        }
        int highestIndex = 0;
        for (int i = 0; i < args.length - 1; i++) {
            System.out.print("Probability that test string is");
            System.out.printf("%9s: ", models[i].getName());
            System.out.printf("%.2f", normalizedProbability[i]);
            System.out.println("");
            if (normalizedProbability[i] > normalizedProbability[highestIndex]) {
                highestIndex = i;
            }
        }
        System.out.println("Test string is most likely " + models[highestIndex].getName() + ".");
    }
}

其他人已经指出了这一点,但对于这一行:

models[i] = new SourceModel(args[i].substring(0, args[i].indexOf(".")), args[i]);

substring方法显然是导致问题的原因,因为indexOf返回 -1 如果. 没有找到。

但是,在这种情况下,代码实际上不是问题,因为赋值声明您可以假设文件名的格式为<source-name>.corpus 话虽如此,实际上,所有命令行参数都应该有一个. 在他们身上,所以这不应该发生。

我会检查您传递的命令行参数。 我的一个猜测是,您可能有一个带有空格的文件名或其他内容。 例如,如果您通过了English GB.corpus ,那么这将显示为 2 个单独的参数(其中一个没有. )。

编辑:正如@Pshemo 在评论中指出的那样,如果您的文件名中有空格,则可以将其放在引号中,以便将其解释为单个命令行参数 - 例如,而不是English GB.corpus ,写成"English GB.corpus" 这将防止异常。

在您的主要方法中,您有:

args[i].indexOf(".")

点 (.) 未找到,因此返回 -1。

您尝试创建一个子字符串:

models[i] = new SourceModel(args[i].substring(0, args[i].indexOf(".")), args[i]);

但由于args[i].indexOf(".")无效,它会抛出异常。

您可以做的是检查点 (.) 是否存在,如果存在则继续:

if(args[i].contains(".")){
models[i] = new SourceModel(args[i].substring(0, args[i].indexOf(".")), args[i]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM