elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  No encuentro el error NullReferenceException
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No encuentro el error NullReferenceException  (Leído 958 veces)
Debyon

Desconectado Desconectado

Mensajes: 4


Ver Perfil
No encuentro el error NullReferenceException
« en: 2 Noviembre 2017, 19:32 »

Estoy usando el Visual Studio 7.2.2 para Mac. Aprendi C# hace un par de años y ahora estoy volviendo a recordar todo porque he estado como 1 año sin hacer nada. El caso es que haciendo un programa simple de consola que leyera un array de 2 dimensiones con unos datos predefinidos y luego los mostrara en pantalla. Supuestamente te pide el modelo a Buscar (que estan apuntados todos en el source), luego si hay 1 sola coincidencia imprime los datos de ese modelo en particular, si hay mas de 1 coincidencia imprime toda la lista de coincidencias y si no hay ninguna coincidencia muestra un mensaje diciendo que no ha encontrado nada.

El caso es que me sale System.NullReferenceException justo despues de poner la palabra para buscar y quiza soy yo que he perdido practica pero no encuentro el fallo. Os dejo el source para que lo veais. Aclaro que me gustaria que me explicarais el fallo en lugar de corregir sin mas el source porfavor. Graciaaas!!


Código
  1. using System;
  2.  
  3. namespace ListadeModelos
  4. {
  5.    class Program
  6.    {
  7.  
  8.        static string[,] modelos = new string[6,9];//contiene los datos de los modelos
  9.  
  10.        static void Main(string[] args)
  11.        {
  12.            string busqueda;//palabra que se usara para buscar entre los modelos del array
  13.  
  14.            while(true)
  15.            {
  16.                Console.Write("Modelo a buscar:       ");
  17.                busqueda = Console.ReadLine();
  18.  
  19.                if (busqueda.ToUpper() == "SALIR")//para salir del programa
  20.                {
  21.                    break;
  22.                }
  23.  
  24.                Buscar(busqueda);
  25.            }
  26.        }
  27.  
  28.        static void Buscar(string busqueda)//Busca en el array un resultado y luego ejecuta el metodo para cada caso
  29.        {
  30.            int contador = 0; // cuenta la cantidad de veces que encuentra un resultado
  31.            int encontrado = 0; //contendra el numero de array para en caso de encontrar solo un resultado saber cual es.
  32.            for (int x = 0; x < modelos.GetLength(0) ; x++)
  33.            {
  34.                if (modelos[x, 0].ToUpper().Contains(busqueda.ToUpper()))
  35.                {
  36.                    contador++;
  37.                    encontrado = x;
  38.                }
  39.            }
  40.  
  41.            if (contador == 1)
  42.            {
  43.                Console.WriteLine("\n\n");
  44.                Imprimir(encontrado);
  45.            }
  46.            else if (contador > 1)
  47.            {
  48.                Console.WriteLine("\n\n");
  49.                Imprimirlista(busqueda);
  50.            }
  51.            else
  52.            {
  53.                Console.WriteLine("\n\n");
  54.                Console.WriteLine("No se han encontrado resultados.");
  55.            }
  56.        }
  57.  
  58.        static void Imprimir(int encontrado)//Imprime en pantalla los datos en caso de que solo haya una coincidencia en la busqueda
  59.        {
  60.            for (int x = 0; x < modelos.GetLength(1); x++)
  61.            {
  62.                if(modelos[encontrado, x].Contains("Nulo"))
  63.                {
  64.                    break;
  65.                }
  66.                Console.WriteLine(modelos[encontrado, x]);
  67.            }
  68.        }
  69.  
  70.        static void Imprimirlista(string busqueda)//Imprime en pantalla la lista de nombres de los modelos encontrados en caso de que haya mas de 1 coincidencia
  71.        {
  72.            for (int x = 0; x < modelos.GetLength(0); x++)
  73.            {
  74.                if (modelos[x,0].ToUpper().Contains(busqueda.ToUpper()))
  75.                {
  76.                    Console.WriteLine(modelos[x,0]);
  77.                }
  78.            }
  79.        }
  80.  
  81.        static void CrearLista()//Crea la lista a partir del array asignando todos los campos como "Nulo" y despues rellenandolos manualmente.
  82.        {
  83.            //creacion de la list
  84.  
  85.            for (int x = 0; x < modelos.GetLength(0); x++)
  86.            {
  87.                for (int y = 0; y < modelos.GetLength(1); y++)
  88.                {
  89.                    modelos[x, y] = "Nulo";
  90.                }
  91.            }
  92.  
  93.            modelos[0, 0] = "Aitana Blanco";
  94.            modelos[0, 1] = "Base D.Doble";
  95.            modelos[0, 2] = "FC-9922/417D";
  96.            modelos[0, 3] = "Peso:   55g";
  97.            modelos[0, 4] = "Dens:   155";
  98.            modelos[0, 5] = "Nulo";
  99.  
  100.            modelos[1, 0] = "Aitana Gris";
  101.            modelos[1, 1] = "Base D.Doble";
  102.            modelos[1, 2] = "Base Aitana Jet";
  103.            modelos[1, 3] = "Peso:   55g";
  104.            modelos[1, 4] = "Dens:   155";
  105.            modelos[1, 5] = "Nulo";
  106.  
  107.            modelos[2, 0] = "Alaska Gris";
  108.            modelos[2, 1] = "Engobe Campana";
  109.            modelos[2, 2] = "Engobe Gres Campana";
  110.            modelos[2, 3] = "Peso:   50g";
  111.            modelos[2, 4] = "Dens:   180";
  112.            modelos[2, 5] = "Base Campana";
  113.            modelos[2, 6] = "MGM-0222";
  114.            modelos[2, 7] = "Peso:   55g";
  115.            modelos[2, 8] = "Dens:   180";
  116.  
  117.            modelos[3, 0] = "Andes Marengo";
  118.            modelos[3, 1] = "Base D.Doble";
  119.            modelos[3, 2] = "Base Etna Jet";
  120.            modelos[3, 3] = "Peso:   50g";
  121.            modelos[3, 4] = "Dens:   155";
  122.            modelos[3, 5] = "Nulo";
  123.  
  124.            modelos[4, 0] = "Andes Sage";
  125.            modelos[4, 1] = "Base D.Doble";
  126.            modelos[4, 2] = "M81/202";
  127.            modelos[4, 3] = "Peso:   50g";
  128.            modelos[4, 4] = "Dens:   155";
  129.            modelos[4, 5] = "Nulo";
  130.  
  131.            modelos[5, 0] = "Arcalis Mix";
  132.            modelos[5, 1] = "Base D.Doble";
  133.            modelos[5, 2] = "EG-445/18992";
  134.            modelos[5, 3] = "Peso:   55g";
  135.            modelos[5, 4] = "Dens:   152";
  136.            modelos[5, 5] = "Nulo";
  137.        }
  138.    }
  139. }


« Última modificación: 3 Noviembre 2017, 23:38 por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: No encuentro el error NullReferenceException
« Respuesta #1 en: 4 Noviembre 2017, 00:59 »

Hola.

Por favor, lee las normas del subforo y utiliza las etiquetas GeShi para darle formato a los bloques de código.. . .

Respondiendo a tu pregunta, el tipo de exceptión de referencia nula, la cual habla por si sola, te está dando una pista de que hay un miembro sin inicializar. Para ser más específicos: nunca inicializas los elementos del Array antes de ponerte a buscar coincidencias en los elementos de dicho Array, o dicho de otra forma: nunca llamas al método "CrearLista" antes del método "Buscar", se puede decir que es un típico "fallo tonto" sin mayor importancia.



Con respecto al código que tienes actualmente, en general, creo que te estás complicando demasiado la vida utilizando un Array multidimensionál sin un motivo que sea razonable aparentemente... aunque solamente fuese con la intención de "recordar y practicar lo aprendido", hay cosas más productivas que poder practicar, ya que los Arrays multidimensioanles y/o los Arrays irregulares (Jagged Arrays) poco o nada los vas a necesitar usar a la larga para un escenario de la vida real, así que te sugiero que definas un tipo personalizado (clase o estructura) para representar la información de un "Modelo", y a partir de ahí tan solo tienes que construir una colección genérica de varios elementos (varios "Modelo") con la que trabajar de forma mucho más sencilla, robusta y sofisticada, en fin, una opción óptima, pues ten en cuenta que además los tipos de colecciones genéricas como por ejemplo Lis<T> ya exponen miembros para buscar y devolver coincidencias en los elementos de la colección, así como buscar el índice de un elemento y etcétera, son cosas que haces en tu código... lo que significa que te ahorrarías la necesidad de implementar esas...metodologías de búsqueda por ti mismo con un Array multidimensional.

Ejemplo de implementación:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;

Código
  1. /// <summary>
  2. /// Represents a model.
  3. /// </summary>
  4. public sealed class Model : IComparable<Model> {
  5.  
  6.    /// <summary>
  7.    /// Gets the model's name.
  8.    /// </summary>
  9.    public string Name { get; }
  10.    /// <summary>
  11.    /// Gets the model's weight, in grams.
  12.    /// </summary>
  13.    public int Weight { get; }
  14.    // etc...
  15.  
  16.    /// <summary>
  17.    /// Prevents a default instance of the <see cref="Model"/> class from being created.
  18.    /// </summary>
  19.    private Model() { }
  20.  
  21.    /// <summary>
  22.    /// Initializes a new instance of the <see cref="Model"/> class.
  23.    /// </summary>
  24.    /// <param name="name">
  25.    /// The model's name.
  26.    /// </param>
  27.    /// <param name="weight">
  28.    /// The model's weight.
  29.    /// </param>
  30.    /// <exception cref="ArgumentNullException">
  31.    /// name - Name can't be null.
  32.    /// </exception>
  33.    /// <exception cref="ArgumentOutOfRangeException">
  34.    /// weight - A value greater than 0 is required.
  35.    /// </exception>
  36.    public Model(string name, int weight) {
  37.        if (string.IsNullOrWhiteSpace(name)) {
  38.            throw new ArgumentNullException("name", "Name can't be null.");
  39.        }
  40.        if (weight <= 0) {
  41.            throw new ArgumentOutOfRangeException("weight", weight, "A value greater than 0 is required.");
  42.        }
  43.  
  44.        this.Name = name;
  45.        this.Weight = weight;
  46.    }
  47.  
  48.    /// <summary>
  49.    /// Compares the current <see cref="Model"/> with another <see cref="Model"/>
  50.    /// and returns an integer value that indicates whether the current instance precedes, follows,
  51.    /// or occurs in the same position in the sort order as the other <see cref="Model"/>.
  52.    /// </summary>
  53.    /// <param name="other">
  54.    /// Other <see cref="Model"/> to compare with this <see cref="Model"/>.
  55.    /// </param>
  56.    /// <returns>
  57.    /// An integer value that indicates the relative order of the objects being compared.
  58.    /// </returns>
  59.    public int CompareTo(Model other) {
  60.        return string.Compare(this.Name, other.Name, StringComparison.Ordinal);
  61.    }
  62.  
  63.    /// <summary>
  64.    /// Returns a <see cref="String"/> that represents this <see cref="Model"/>.
  65.    /// </summary>
  66.    /// <returns>
  67.    /// A <see cref="String"/> that represents this <see cref="Model"/>.
  68.    /// </returns>
  69.    public override string ToString() {
  70.        return string.Format("{{ {0}:{1}, {2}:{3} }}",
  71.                             nameof(this.Name), this.Name,
  72.                             nameof(this.Weight), this.Weight);
  73.    }
  74.  
  75. }

Código
  1. class Program {
  2.  
  3.    private static SortedSet<Model> Models; // Note that collection elements are sorted by Model.Name property.
  4.  
  5.    static void Main(string[] args) {
  6.        string input = null;
  7.        IEnumerable<Model> matches = null;
  8.  
  9.        Program.BuildModelCollection();
  10.        while (true) {
  11.            Console.Write("Input a model's name to match: ");
  12.            input = Console.ReadLine();
  13.            matches = Program.MatchModelName(input);
  14.            Program.PrintMathes(matches);
  15.        }
  16.    }
  17.  
  18.    private static void BuildModelCollection() {
  19.        Program.Models = new SortedSet<Model> {
  20.            new Model("Aitana Blanco", 55),
  21.            new Model("Aitana Gris", 55),
  22.            new Model("Arcalis Mix", 55),
  23.            new Model("Andes Marengo", 50),
  24.            new Model("Andes Sage", 50),
  25.            new Model("Alaska Gris", 50)
  26.        };
  27.    }
  28.  
  29.    private static IEnumerable<Model> MatchModelName(string input) {
  30.        foreach (Model m in Program.Models) {
  31.            if (m.Name.ToLower().Contains(input.ToLower())) {
  32.                yield return m;
  33.            }
  34.        }
  35.    }
  36.  
  37.    private static void PrintMathes(IEnumerable<Model> matches) {
  38.        if (matches == null) {
  39.            Console.WriteLine("No results found.");
  40.            return;
  41.        }
  42.  
  43.        int count = 0;
  44.        foreach (Model m in matches) {
  45.            Console.WriteLine(string.Format("[{0}]: {1}", Interlocked.Increment(ref count), m.ToString()));
  46.        }
  47.        Console.WriteLine();
  48.    }
  49.  
  50. }

Nota: El código fuente de arriba ha sido desarrollado bajo Windows con el framework multiplataforma .NET Core para soportar tu sistema operativo.

Resultado de ejecución:



PD: Evidentemente la clase "Modelo" es tan solo un ejemplo simplificado el cual lo adaptarías y lo extenderias para cubrir el resto de necesidades que tengas en tu escenario de trabajo.

Un saludo.


« Última modificación: 4 Noviembre 2017, 01:41 por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
No encuentro el error, ayuda o_o
Programación C/C++
deserto 8 2,167 Último mensaje 15 Septiembre 2013, 19:38
por deserto
No encuentro mi error :(
Java
Ila26 3 1,151 Último mensaje 1 Diciembre 2013, 19:35
por Zoik
Error Ejercicio JButton, no encuentro el error[Resuleto, se puede cerrar]
Java
MinW 0 1,069 Último mensaje 27 Diciembre 2013, 17:59
por MinW
No encuentro el error
Java
taos19 4 1,624 Último mensaje 18 Marzo 2014, 22:12
por taos19
Solucionar Error NullReferenceException en VB.Net 2010
.NET (C#, VB.NET, ASP)
okik 1 1,135 Último mensaje 6 Marzo 2015, 17:46
por okik
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines