Loading...
krum_43 avatar krum_43 756 Точки

NullReferenceException-как да го избегна.

В една задача от Tech-модула (Immune System) компилатора ми върна NкullReferenceException.

Направих справка в интернет и в общи линии разбрах за какво става въпрос,но не мога да рзбера от къде се появява при мен.

Ето условието на задачата:

https://softuni.bg/trainings/resources/officedocument/31796/more-exercise-problem-descriptions-optional-programming-fundamentals-may-2018/1939,

а ето и моето решение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Imunne_Sysrem
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, int> datesvirusstrench = new Dictionary<string, int>();
            Dictionary<string, int> datestime = new Dictionary<string, int>();
            Dictionary<string, int> viruscount = new Dictionary<string, int>();
            int inicialhealth = int.Parse(Console.ReadLine());
            double remeininghealth = inicialhealth;
            int virusstrench = 0;           
            string[] viruslist = new string[100];
            int counter = 0;
            while (true)
            {
                int timetodefeat = 0;
                int timeminute = 0;
                int timeseconds =0;
                int sum = 0;
                string virusname = Console.ReadLine();
                viruslist[counter] = virusname;
              
                for (int i = 0; i < virusname.Length; i++)
                {
                    sum += virusname[i];
                }
                virusstrench = sum / 3;                              
                if (virusname == "end")
                {
                    for (int i = 0; i < counter; i++)
                    {
                        if (viruscount.ContainsKey(viruslist[i]))
                        {
                            viruscount[viruslist[i]] += 1;
                        }
                        else
                        {
                            viruscount.Add(viruslist[i], 1);
                        }
                        if ((viruscount[viruslist[i]] == 1))
                        {
                            
                            Console.WriteLine($"Virus {viruslist[i]}: {datesvirusstrench[viruslist[i]]} => {datestime[viruslist[i]]} seconds");
                            Console.WriteLine($"{viruslist[i]} defeated in {secondstominute(datestime[viruslist[i]])}m {secondstoostseconds(datestime[viruslist[i]])}s.");
                            remeininghealth -= datestime[viruslist[i]];
                            Console.WriteLine($"Remeining health: {Math.Floor(remeininghealth)}");
                        }
                        else
                        {                            
                            Console.WriteLine($"Virus {viruslist[i]}: {datesvirusstrench[viruslist[i]]} => {datestime[viruslist[i]]/3} seconds");
                            remeininghealth -=datestime[viruslist[i]]/3;
                            Console.WriteLine($"{viruslist[i]} defeated in {secondstominute(datestime[viruslist[i]]/3)}m {secondstoostseconds(datestime[viruslist[i]]/3)}s.");
                            Console.WriteLine($"Remeining health: {Math.Floor(remeininghealth)}");
                        }
                           remeininghealth = 1.20 * remeininghealth;
                        if(remeininghealth >= inicialhealth)
                        {
                            remeininghealth = inicialhealth;
                        }
                    }
                    Console.WriteLine($"Final Health: {Math.Floor(remeininghealth)}");
                }
                if (!(datesvirusstrench.ContainsKey(virusname)))
                    {
                     timetodefeat = virusstrench * virusname.Length;
                     timeminute = timetodefeat / 60;
                     timeseconds = timetodefeat % 60;
                     datesvirusstrench.Add(virusname, virusstrench);                     
                     datestime.Add(virusname, timetodefeat);
                    }                
                counter++;
            }                            

            
          }
        static int secondstominute(int s)
        {
            int minute;

            minute = s / 60;
            return minute;
        }
        static int secondstoostseconds(int s)
        {
            int ost;
            ost = s % 60;
            return ost;
        }
    }
  }

Тагове:
e.manolov avatar e.manolov 80 Точки
Best Answer

Здравей колега, прегледах кода ти набързо и видях къде ти е проблема.

След като получиш команда "end", трябва да си принтираш резултата и програмата ти да приключи, тоест да не чака още параметри да й се подадат.

Твоята програма печата резултата, което е ок, но не приключва, тя чака да й се подадат още параметри.

Може да направиш следното:

Този ред код:  Console.WriteLine($"Final Health: {Math.Floor(remeininghealth)}"); - да го вкараш във for цикъла,

а на негово място да напишеш "return;" и би трябвало да ти работи.

При такъв тип задачи е най-добре да се научиш как се работи с debuger-а, а ако знаеш исползвай го смело, ако не ще ти трябват няколко минутки да се научиш, просто трябва да прочетеш малко. Ще ти бъде от голяма полза. Успех.

Хубав ден.

0
30/10/2018 09:00:28
krum_43 avatar krum_43 756 Точки

Да благодаря ти.Наистина не го бях съобразил.След корекцията ми даде 30/100.

Явно има още нещо за доизкусуряване.

Лек и успешен ден.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.