Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Проверьте, является ли элемент последним элементом контейнера.
, Почему Вы хотите сделать это?
Вы могли просто поместить инструкции после цикла. (Что Вы выполняетесь на последнем элементе)
Используя стандарт "Для Каждого" цикла Вы не можете. Намерение "для Каждого" цикла состоит в том, чтобы позволить Вам концентрироваться на данных вместо базового набора.
Вероятно, было бы легче просто использовать Для цикла вместо ForEach. Но, точно так же Вы могли сохранить счетчик в своем Цикле foreach и видеть, если его равное yourCollection.Count - 1
, то Вы находитесь в последнем повторении.
Короткий ответ: Вы не можете
ответ Long: нет ничего в семантике оператора For Each, который позволяет Вам определять, выполняете ли Вы первое, в последний раз или какое-либо конкретное повторение.
Для Каждого создается в IEnumerable и IEnumerable<> интерфейсы и поведение зависят от реализации, которую Вы называете. Это допустимо, хотя путая, для набора, которого Вы выполняете итерации для возврата элементов в другом порядке каждый раз. К счастью, List<> не делает этого.
, Если действительно необходимо знать, что конкретное повторение является последним, Вы могли определить последний элемент (заранее) и затем принять другие меры при обнаружении с тем элементом.
Легче должен был бы обнаружить первый повторение (скажите через булевскую переменную), и затем сделайте что-то другое.
пример (C#, но VB будет подобен):
StringBuilder result = new StringBuilder();
bool firstTime = true;
foreach(string s in names)
{
if (!firstTime)
{
result.Append(", ");
}
result.Append(s);
firstTime = false;
}
Если Вы связываетесь с IEnumerable. Необходимо ли быть в цикле foreach? Если не Вы могли бы объявить переменную незадолго до цикла foreach. Установите его во время цикла. Затем используйте его после цикла (если не пустой)
С foreach Вы не можете знать это, пока не слишком поздно (т.е. Вы не в курсе).
Примечание, я предполагаю, что Вы используете что-то, где у Вас только есть интерфейс IEnumerable. Если Вы имеете список, массив, и т.д. затем следуете другим ответам здесь, который использует.Count или подобный для обнаружения сколько объектов, там, и таким образом можно отслеживать то, где Вы находитесь в наборе.
Однако только с IEnumerable/IEnumerator, нет никакого способа знать наверняка, существует ли больше, если Вы используете foreach.
, Если необходимо знать это, используйте IEnumerable сами, который является тем, что делает foreach.
ниже решения для C#, но должен перевести легко в VB.NET:
List<Int32> nums = new List<Int32>();
nums.Add(1);
nums.Add(2);
nums.Add(3);
IEnumerator<Int32> enumerator = nums.GetEnumerator();
if (enumerator.MoveNext())
{
// at least one value available
while (true)
{
// make a copy of it
Int32 current = enumerator.Current;
// determine if it was the last value
// if not, enumerator.Current is now the next value
if (enumerator.MoveNext())
{
Console.Out.WriteLine("not last: " + current);
}
else
{
Console.Out.WriteLine("last: " + current);
break;
}
}
}
enumerator.Dispose();
Это распечатает:
not last: 1
not last: 2
last: 3
прием должен сделать копию текущего значения, затем попросить, чтобы перечислитель попытался идти дальше к следующему. Если это перестало работать, копия, которую Вы сделали, была действительно последним значением, иначе существует больше.
ls | vim -
для имения вывода ls в энергии.
– Veda
9 March 2015 в 20:00
Было бы легче использовать Для цикла вместо ForEach, однако Вы могли сделать что-то как
If item.Equals(itemCollection(itemCollection.Count)) Then
...
End If
внутренняя часть Вашего Цикла foreach... Принятие объекта правильно переопределило, Равняется методу.
Это является, вероятно, намного более интенсивно использующим ресурсы, чем просто использование Для цикла или отслеживания текущего индекса в отдельной переменной.
я не уверен, является ли это правильным синтаксисом, это было долгое время, так как я использовал VB.
For Each xObj In xColl
If xObj = xColl(xColl.Count) Then ...
Next
rm <(...)
, попытается удалить что-то как/proc/fd/123
. – jordanm 1 December 2013 в 13:48