ArgumentOutOfRange exception C#



我正在做我的作业,我必须执行一个程序,该程序将简单的字母从e和f等文件中扩展到连续作品,也可以在文件夹中给出,例如e T E-F等。无论如何,下面显示的代码为我提供了范围异常的参数。我在Java中制作了相同的代码,所有代码都很好。我不知道为什么在C#中给我这个例外。请给我一些建议!

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

eft

a ()

e

e t | e-t | t

t*f | t/f | f

a |(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();
    }

但是为什么在Java中起作用而在这里不工作?我很困惑

如有疑问,请阅读文档。在Java中,substring的2参数超载采用启动索引和端索引。在.net中,第二个参数是要拿的字符数, teend index。

所以您可能想要

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

或更简单,只需使用1参数版本即可从指定的索引中获取所有字符:

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

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

从根本上讲,值得退后一步,找出为什么您无法自己解决的原因...即使您以前错过了:

  • 查看在您的代码中抛出例外的线
  • 查看哪种方法实际上抛出了例外(在这种情况下为String.Substring
  • 仔细查看异常消息(这是一个非常好的提示!),也要嵌套异常
  • 仔细阅读有关相关方法的文档,尤其是描述参数和异常的部分

这是一个常见的错误,将代码从Java移植到C#。

Java中的子字符串开始&amp;结束参数,但在C#中,它们是开始和长度

最新更新