Невозможно вызвать исключение, не получив сообщение об ошибке: "Не все пути кода возвращают значение"
В настоящее время я пытаюсь сделать новую функцию внутри класса (в C#) и внутри меня
public static Planet searchByName(String nameIn)
{
for (int i = 0; i < planetList.Count; i++)
{
Planet returnPlanet = null;
if (planetList.ElementAt(i).name == nameIn)
{
returnPlanet = planetList.ElementAt(i);
}
if (returnPlanet == null)
{
throw new System.ArgumentException(String.Format("Planet with name {0} does not exist", nameIn));
}
return returnPlanet;
}
}
Я не уверен, как вызвать исключение и заставить его вернуть значение (или, по крайней мере, избавиться от текущей ошибки)
Редактировать: Ах, я вижу, как многие из вас отмечали, что цикл, который у меня есть, может не запускаться (хотя в моем коде он всегда будет работать, но я сомневаюсь, что компилятор знал бы это)
3 ответа
Что будет, если planetList
не было участников? Цикл никогда не войдет и ничего не будет возвращено.
Вам нужно что-то вернуть, если это так. Просто возвращение нуля будет работать:
public static Planet searchByName(String nameIn)
{
for (int i = 0; i < planetList.Count; i++)
{
Planet returnPlanet = null;
if (planetList.ElementAt(i).name == nameIn)
{
returnPlanet = planetList.ElementAt(i);
}
if (returnPlanet == null)
{
throw new System.ArgumentException(String.Format("Planet with name {0} does not exist", nameIn));
}
return returnPlanet;
}
return null;
}
Однако, если вы присмотритесь к своему коду, то обнаружите, что на первой итерации планета либо будет найдена, либо будет сгенерировано исключение, это единственные два варианта. Вы должны генерировать исключение, только если был проверен весь список, который будет выглядеть следующим образом:
public static Planet searchByName(String nameIn)
{
for (int i = 0; i < planetList.Count; i++)
{
Planet planet = planetList.ElementAt(i);
if (nameIn == planet.name)
return planet;
}
throw new System.ArgumentException(String.Format("Planet with name {0} does not exist", nameIn));
}
Вы также можете достичь той же цели с LINQ, который выглядит намного лучше:
public static Planet searchByName(string name)
{
return planetList.FirstOrDefault(planet => planet.name == name);
}
Если твой for
условие цикла (i < planetList.Count
) ложно for
цикл не будет запущен. Вам нужно return
что-то, если for
не работает
public static Planet searchByName(String nameIn)
{
for (int i = 0; i < planetList.Count; i++)
{
. . .
}
return null;
}
Вы ищете Planet
с name
поле, которое соответствует nameIn
,
Псевдокод для этого будет что-то вроде
for every planet in the list of planets
if planet's name == nameIn
return plant
after the for loop, if no matching planet was found, throw an exception
Вот ваш код, следующий за моим псевдокодом
public static Planet searchByName(String nameIn)
{
for (int i = 0; i < planetList.Count; i++)
{
if (planetList.ElementAt(i).name == nameIn)
{
return planetList.ElementAt(i);
}
}
throw new System.ArgumentException(String.Format("Planet with name {0} does not exist", nameIn));
}
Вот как я мог бы написать это для цикла for-each:
public static Planet searchByName(String nameIn)
{
for (var planet in planetList)
{
if (planet.name == nameIn)
{
return planet;
}
}
throw new System.ArgumentException(String.Format("Planet with name {0} does not exist", nameIn));
}
Вот как бы я написал это с помощью LINQ:
public static Planet searchByName(String nameIn)
{
Planet planet = planetList.FirstOrDefault(p => p.name == nameIn);
if (planet != null)
{
return planet;
}
else
{
throw new System.ArgumentException(String.Format("Planet with name {0} does not exist", nameIn))
}
}