2

我正在做我的作业,我必须做一个程序,将文件中的简单字母(如 E 和 F)扩展到连续产生式,也在文件夹中给出,如 E+T EF 等。无论如何,下面显示的代码给了我参数超出范围异常。我用java编写了相同的代码,一切正常。我不知道为什么在 C# 中它给了我这个例外。请给我一些建议!!

我忘了把我正在阅读的文件放在:

电子转帐

一个+()

E+T|ET|T

T*F|T/F|F

一个|(E)

public void generare(){

        String N = null;
        String T = null;
        String S = null;
        String[] P = null;

        TextReader tr = new StreamReader("dateIntrare.txt");

        try
        {

            N = tr.ReadLine();
            T = tr.ReadLine();
            S = tr.ReadLine();
            P = new String[N.Length];

            for (int i = 0; i < N.Length; i++)
            {
                P[i] = tr.ReadLine();
            }

            tr.Close();

            Console.WriteLine("Neterminale: N = " + N);
            Console.WriteLine("Terminale:  T = " + T);
            Console.WriteLine("Productii ");

            for (int i = 0; i < P.Length; i++)
                Console.WriteLine("\t" + P[i]);

            Console.WriteLine("Start: S = " + S);

            Boolean gata = false;

            String iesire = S.Substring(0, S.Length);

            Console.WriteLine("\nRezultat");
            Console.Write("\t");

            while ((gata == false) && (iesire.Length < 50))
            {

                Console.Write(iesire);

                Boolean ok = false;

                for (int i = iesire.Length - 1; i >= 0 && ok == false; i--)
                {
                    for (int j = 0; j < N.Length && ok == false; j++)
                        if (N[j] == iesire[i])
                        {
                            String s1 = iesire.Substring(0, i);
                            String s2 = iesire.Substring(i + 1, iesire.Length); // HERE IS THE EXCEPTION TAKING PLACE

                            String inlocuire = P[N.IndexOf(iesire[i])];
                            String[] optiuni = null;

                            String[] st = inlocuire.Split('|');
                            int k = 0;

                            foreach (String now in st)
                            {
                                k++;
                            }

                            optiuni = new String[k];
                            st = inlocuire.Split('|');

                            k = 0;

                            foreach (string next in st)
                            {
                                optiuni[k++] = next;
                            }

                            Random rand = new Random();
                            int randNr = rand.Next(optiuni.Length);

                            String inlocuireRandom = optiuni[randNr];

                            iesire = s1 + inlocuireRandom + s2;

                            ok = true;

                        }
                }

                if (ok == false)
                {
                    gata = true;
                }

                else
                {

                    if (iesire.Length < 50)
                        Console.Write(" => ");
                }
            }
        }

        catch (FileNotFoundException)
        {
            Console.WriteLine("Eroare, fisierul nu exista!");
        }

        Console.WriteLine();
    }
4

2 回答 2

4

但是为什么在java中有效而在这里不行呢?我很困惑

如有疑问,请阅读文档。在 Java 中,2 参数重载substring需要一个开始索引和一个结束索引。在 .NET 中,第二个参数是要采用的字符数,而不是结束索引。

所以你可能想要

String s2 = iesire.Substring(i + 1, iesire.Length - i - 1);

或者更简单一点,只需使用 1 参数版本,它会从指定索引开始获取所有字符:

String s2 = iesire.Substring(i + 1);

(我也会在 Java 中使用它......)

但从根本上说,值得退后一步,弄清楚为什么你不能自己解决这个问题……即使你以前错过了:

  • 查看代码中引发异常的行
  • 查看哪个方法实际抛出了异常(String.Substring在本例中)
  • 仔细查看异常消息(这是一个非常好的提示!)以及任何嵌套的异常
  • Read the documentation for the relevant method carefully, especially the sections describing the parameters and exceptions
于 2012-10-20T21:34:50.783 回答
2

这是将代码从 Java 移植到 c# 时的常见错误。

Java 中的子字符串采用 start 和 end 参数,但在 c# 中它们是 start 和 length

于 2012-10-20T21:34:42.987 回答