2

私は宿題をしていて、E や F などのファイルからの単純な文字を、E + T EF などのフォルダーにも与えられた連続的なプロダクションに拡張するプログラムを実行する必要があります。とにかく、以下に示すコードは私に与えます範囲外の引数の例外。Java で同じコードを作成しましたが、すべて正常に動作します。C# でこの例外が発生する理由がわかりません。どなたかアドバイスお願いします!!

読んでいるファイルを置くのを忘れました:

EFT

+()

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 では、2 番目のパラメーターは取得する文字数であり、終了インデックスではありません。

だからあなたはおそらく欲しい

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

または、より簡単にするために、指定されたインデックス以降のすべての文字を取得する 1 パラメータ バージョンを使用します。

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

(Javaでもそれを使用します...)

ただし、基本的には、一歩下がって、自分でこれを解決できなかった理由を検討する価値があります...以前に見逃していたとしても:

  • コードで例外をスローした行を見てください
  • どのメソッドが実際に例外をスローしたかを調べます (String.Substringこの場合)
  • 例外メッセージを注意深く見てください (これは本当に良いヒントです!) ネストされた例外もすべて確認してください。
  • 関連するメソッドのドキュメント、特にパラメーターと例外について説明しているセクションを注意深く読んでください。
于 2012-10-20T21:34:50.783 に答える
2

これは、コードを Java から C# に移植するときによくある間違いです。

Java の部分文字列は start と end パラメーターを取りますが、C# では start と length です

于 2012-10-20T21:34:42.987 に答える