Domanda

Non sono sicuro del motivo per cui sto ricevendo questo errore, ma questo codice non dovrebbe essere compilato, poiché sto già verificando se la coda viene inizializzata?

public static void Main(String[] args)
{
    Byte maxSize;
    Queue queue;

    if(args.Length != 0)
    {
        if(Byte.TryParse(args[0], out maxSize))
            queue = new Queue(){MaxSize = maxSize};
        else
            Environment.Exit(0);
    }
    else
    {
        Environment.Exit(0);
    }

    for(Byte j = 0; j < queue.MaxSize; j++)
        queue.Insert(j);
    for(Byte j = 0; j < queue.MaxSize; j++)
        Console.WriteLine(queue.Remove());
}

Quindi se la coda non è inizializzata, i cicli for non sono raggiungibili, giusto? Poiché il programma termina già con Environment.Exit (0)?

Spero che tu possa darmi alcuni suggerimenti :)

Grazie.

È stato utile?

Soluzione

Il compilatore non sa che Environment.Exit () sta per terminare il programma; ti vede solo eseguire un metodo statico su una classe. Inizializza coda su null quando lo dichiari.

Queue queue = null;

Altri suggerimenti

Il compilatore non sa che Environment.Exit () non ritorna. Perché non solo " return " da Main ()?

Un paio di modi diversi per risolvere il problema:

Basta sostituire Environment.Exit con return. Il compilatore sa che return termina il metodo, ma non lo sa Environment.Exit.

static void Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return;
    } else {
       return;   
}

Certo, puoi davvero cavartela solo perché stai usando 0 come codice di uscita in tutti i casi. Davvero, dovresti restituire un int invece di usare Environment.Exit. Per questo caso particolare, questo sarebbe il mio metodo preferito

static int Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return 1;
    } else {
       return 2;
    }
}

Inizializza la coda su null, che in realtà è solo un trucco del compilatore che dice " Capirò le mie variabili non inizializzate, grazie mille " ;. È un trucco utile, ma in questo caso non mi piace: ne hai troppi se rami per verificare facilmente che lo stai facendo correttamente. Se davvero volessi farlo in questo modo, qualcosa del genere sarebbe più chiaro:

static void Main(string[] args) {
  Byte maxSize;
  Queue queue = null;

  if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) {
     Environment.Exit(0);
  }
  queue = new Queue(){MaxSize = maxSize};

  for(Byte j = 0; j < queue.MaxSize; j++)
    queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
    Console.WriteLine(queue.Remove());
}

Aggiungi un'istruzione return dopo Environment.Exit. Ancora una volta, questo è più un trucco del compilatore - ma è leggermente più legittimo IMO perché aggiunge semantica anche agli umani (anche se ti impedirà di vantare una copertura del codice decantata al 100%)

static void Main(String[] args) {
  if(args.Length != 0) {
     if(Byte.TryParse(args[0], out maxSize)) {
        queue = new Queue(){MaxSize = maxSize};
     } else {
        Environment.Exit(0);
        return;
     }
  } else { 
     Environment.Exit(0);
     return;
  }

  for(Byte j = 0; j < queue.MaxSize; j++)
     queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
     Console.WriteLine(queue.Remove());
}

Il compilatore sa solo che il codice è o non è raggiungibile se si utilizza " return " ;. Pensa a Environment.Exit () come una funzione che chiami e il compilatore non sa che chiuderà l'applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top