2017-10-16 28 views
1

Celui-ci est un énigmatique pour moi. Je sais que la plupart de ces types d'erreurs proviennent d'essayer d'accéder à quelque chose en dehors des limites d'un tableau (et l'erreur le dit aussi), mais cela ne s'additionne pas ici. Ce qui suit est l'erreur:System.IndexOutOfRangeException dans l'application console - Probablement basé sur le système

System.IndexOutOfRangeException: Index was outside the bounds of the array at MyProgram.Program.Main(String[] args) in Program.cs:line 47

Le seul problème ici étant que la première ligne de mon programme est à la ligne 47 (qui définit juste une variable MailAddress). Si je commente cette ligne, les erreurs de deuxième ligne, qui définit un client SMTP. Jusqu'à hier, ce même programme a fonctionné tous les matins pendant les deux derniers mois. Je n'ai pas changé le code, recompilé, ou fait quelque chose dans l'intervalle (mais depuis, j'ai essayé de déboguer pour le comprendre après qu'il s'est cassé).

Le programme lui-même est assez simple, il utilise simplement System.Net.Mail et System.IO pour parcourir certains fichiers texte et envoyer un e-mail du contenu.

Ma question, même si je sais qu'il n'est pas conseillé de poster sans code, est générale. Puisque je sais que cela fonctionne sur un autre système (je l'ai juste couru là-bas), ma question est ce qui pourrait causer ce comportement/erreur?

choses que j'ai essayé:

  • .NET Framework Repair 4.5.2 (le Cadre cible du programme est de 4,5).
  • J'ai essayé de recompiler x64 (précédemment x86).
  • Redémarré (évidemment, je voulais juste le signaler).
  • Pare-feu Windows désactivé à tester (peu probable à cause de l'erreur).

Y a-t-il quelque chose d'évident ici qui me manque?

EDIT:

 static void Main(string[] args) 
    { 

      MailAddress sendEmailFromNice = new MailAddress("[email protected]", "Nice Email Name"); 
      SmtpClient client = new SmtpClient(); 
      client.Port = smtpport; 
      client.Host = smtphost; 
      client.EnableSsl = true; 
      client.Timeout = 25000; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.UseDefaultCredentials = false; 
      client.Credentials = new NetworkCredential(sendEmailFrom, sendEmailFromPass); 

      ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
      { return true; }; 

      // gotten list 
      List<int> alreadyGottenList = new List<int>(); 
      string line = null; 
      string[] lineSplit = null; 
      int currentInt = 0; 
      if (File.Exists(storedIntList)) 
      { 
       using (var reader = new StreamReader(storedIntList)) 
       { 
        line = null; 
        while ((line = reader.ReadLine()) != null) 
        { 
         currentInt = int.Parse(line.Trim()); 
         alreadyGottenList.Add(currentInt); 
         currentInt = 0; 
        } 
       } 
      } 

      List<int> newIntsToGet = new List<int>(); 
      if (File.Exists(LogFile)) 
      { 
       using (var readerPrimaryToday = new StreamReader(LogFile)) 
       { 
        while ((line = readerPrimaryToday.ReadLine()) != null) 
        { 
         lineSplit = line.Split(','); 

         if (lineSplit[0].ToString() != "header") 
         { 
          currentInt = int.Parse(lineSplit[8].ToString().Trim()); 
         } 
         if (!alreadyGottenList.Contains(currentInt)) 
         { 
          newIntsToGet.Add(currentInt); 
          alreadyGottenList.Add(currentInt); 
          File.AppendAllText(storedIntList, currentInt.ToString() + Environment.NewLine); 
         } 
        } 
       } 
      } 

    string emailBody = "BodyHere "; 
    string emailSubject = "Subject here"; 

    foreach (var thisVar in newIntsToGet) 
    { 
     emailBody = emailBody + thisVar.ToString() + Environment.NewLine; 
    } 

    MailMessage messageToSend = new MailMessage(); 
    messageToSend.Subject = emailSubject; 
    messageToSend.Body = emailBody; 
    messageToSend.IsBodyHtml = false; 

    messageToSend.To.Add(sendEmailTo); 
    client.Send(messageToSend); 
} 

Il a juste un fichier .csv avec des chiffres, puis vérifie un fichier texte pour tous les chiffres que je ne l'ai pas déjà vu. S'il en trouve un, il l'ajoute à un e-mail et au fichier .csv stocké.

+3

Montrez-nous le code – Baksteen

+1

Veuillez partager du code pour passer. –

+0

Quel était l'indice, et combien de temps était le tableau ... –

Répondre

2

Je ne suis pas sûr, mais en regardant votre code, IndexOutOfArrayException qui peuvent être liées avec les lignes suivantes:

if (lineSplit[0].ToString() != "header") 
{ 
    currentInt = int.Parse(lineSplit[8].ToString().Trim()); 
} 

Vous ne semblez pas vérifier s'il y avait quelque chose de retour dans lineSplit. Si, par exemple, le fichier LogFile que vous avez lu a été modifié et contient maintenant une nouvelle ligne, cela entraînera un problème pour lineSplit [0] - ou si le journal a été modifié et que vous n'avez plus la valeur de la 9ème colonne lineSplit [8]

+0

J'avais pensé à la même chose. Vous vous attendez à ce que l'erreur soit sur cette ligne et ce n'est pas le cas. Le fichier (j'ai vérifié manuellement) n'a pas non plus changé de structure. –

+1

Parfois, la ligne d'erreur n'est pas toujours dans la ligne exacte du code si elle a été optimisée, donc je regarde habituellement dans la limite de la méthode (dans ce cas 'Main'). Seriez-vous capable de mettre un point de rupture là-dedans pour déboguer? OU que s'est-il passé si vous ajoutez une vérification pour vous assurer que lineSplit contient l'index souhaité? - (ie: ajouter une vérification comme ---- if (lineSplit.Count()> = 9 && lineSplit [0] .ToString()! = "En-tête") ----) – hsoesanto

+0

Oh wow! Ça a marché. Désolé pour toute la confusion, apparemment quelque part dans le fichier il y a une ligne qui a été formée incorrectement (la première fois que c'est arrivé). Je vais devoir voir ce que c'est, mais en attendant, le contrôle pour s'assurer qu'il y a un nombre de 9 le corrige. Merci beaucoup, ça va m'apprendre à ne pas poster mon code! –