我正在做我的作业,我必须执行一个程序,该程序将简单的字母从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#中,它们是开始和长度