2010-10-29 6 views
6

Ok, nouveau codeur ici qui cherche un petit aperçu de ce problème. J'ai donc une boucle comme ça commence comme ceci:Gestion d'une exception nulle C#

for (int i = 0; i < rowHandles.Length; i++) 
{ 
     .........code.... 
} 

rowHandles est un tableau int qui contient des lignes de données. Cette boucle for a un code qui supprime les lignes de données lorsqu'un clic sur un bouton est cliqué, pour être précis, il s'agit d'un bouton Supprimer une bande d'outils de grille et cela se trouve dans le gestionnaire d'événement de clic sur le bouton Supprimer. Le problème est que le bouton de suppression peut être cliqué quand il n'y a plus de lignes, donc rowHandles.Length est égal à null. Comment pourrais-je empêcher cela d'arrêter le programme? Y a-t-il quelque chose que je pourrais ajouter à l'intérieur de la boucle for, dans la déclaration de boucle for, ou en dehors de la boucle for pour corriger cela? Peut-être un essai attraper? Comment cela serait-il structuré autour de ce problème/boucle spécifique?

Merci pour votre aide - Débutant Coder

+0

Vous avez oublié de mentionner Cornell dans votre message. –

Répondre

10

Si le problème est que rowHandles peut être null puis juste ajouter un contrôle explicite pour ce qui vous empêche d'exécuter l'instruction for. Une autre option consisterait à désactiver totalement le bouton de suppression s'il n'y a pas de lignes à supprimer. L'opération n'est pas valide alors évitez-la dès le début.

+0

Merci, je me sens un peu bête parce que je l'ai essayé à l'opposé: pour (...) {if (rowhandles! = Null)} et ça n'a pas fonctionné alors je me grattais la tête, on dirait que j'avais le bonne idée juste une mauvaise exécution. J'y arriverai! Merci pour votre contribution! –

+4

@Nard, ne vous sentez pas stupide. Les erreurs sont la meilleure façon d'apprendre et nous en avons tous fait beaucoup. – JaredPar

+0

Je fais des va-et-vient à ce sujet; Je vois beaucoup de code de vérification null qui cache les bogues parce que les développeurs ne veulent pas savoir pourquoi quelque chose est nul. Dans ce cas, on dirait que null n'est pas valide, donc je ne suis pas sûr que l'autorisation d'une valeur nulle soit une bonne idée. Je préférerais désactiver le bouton et ne pas laisser le contrôle nul. Met le fardeau sur l'appelant, mais vous allez échouer immédiatement si quelqu'un l'appelle avec rowHandles étant null. Des pensées? –

2

C'est pasrowHandles.Length qui est nul, c'est rowHandles lui-même.
Une solution commune serait:

if (rowHandles != null) 
//Your loop here 
3

Le problème est peut être cliqué sur le bouton de suppression quand il n'y a pas de ligne, donc rowHandles.Length est égal à null.

Ceci est faux. Quand il y a 0 éléments, Length est mis à 0. Ce qui est nul est probablement rowHandles. Vous devez gérer cette condition avant d'entrer dans votre boucle.

0

changement à une boucle foreach:

foreach (var rowHandle in rowHandles) 
{ 
    // use rowHandle instead of rowHandles[i] 
} 

De cette façon, à condition que l'ensemble rowHandles objet est non nul (un chèque nul rapide peut vérifier) ​​vous itérer sur tous les articles, et s'il n'y a aucun article , vous ne irez pas du tout.

2

S'il n'y a plus de lignes, rowHandles.Length aura la valeur zéro et non null. Si vous se débarrasser de rowHandles après la boucle, vous pouvez juste faire:

if (rowHandles != null) 
{ 
    for (int i = 0; i < rowHandles.Length; i++) 
    { 
      // Code 
    } 
} 

Pas besoin de gestion des exceptions. D'un autre côté, si vous permettez à rowHandles d'être modifié par autre chose pendant que cette boucle est en cours d'exécution, c'est une autre histoire.

1

On dirait que la longueur n'est pas la fine qui est nulle. Plutôt, rowHandles est null et vous obtenez l'exception null en essayant d'accéder à la propriété Length.

if(rowHandles != null) 
{ 
    //for loop 
} 
1

Je vous suggère d'essayer autant que possible de coller à la Single Responsibility Principle, en ce que vous laissez le code faire ce qu'il est censé faire, et de gérer les erreurs ailleurs.

Il est logique pour moi que rowHandles soit utilisé ailleurs, vous devriez donc centraliser le processus de vérification pour savoir s'il s'agit ou non de null.

Si vous choisissez toujours de le gérer dans le corps de code que vous référencez, l'une des solutions proposées fonctionnera.

6

Un principe important ici est jamais gérer une exception que vous auriez pu empêcher en premier lieu. Vous ne devriez jamais jamais gérer une exception de référence nulle; une exception de référence nulle indique un bogue dans votre programme qui devrait être corrigé, pas une occurrence attendue qui devrait être piégée et ignorée. Soit écrire du code qui garantit que la valeur n'est pas nulle, soit détecter qu'elle est nulle et ne pas la déréférencer.

+0

Mis à part le fait que ce soit une mauvaise pratique, laisser une exception de référence nulle se produire (et ensuite l'attraper) causer des problèmes avec l'état des programmes? Par exemple, je sais que certaines exceptions peuvent corrompre l'état du programme, mais est-ce que le runtime .NET vérifie que null-reference ne le fait pas? –

+0

@Matt: La lecture, l'écriture ou l'invocation d'une référence nulle ne change pas d'état; l'exception arrive toujours avant que quelque chose de mauvais puisse être écrit. –

+0

merci de confirmer cela. –

Questions connexes