Другим случаем, когда NullReferenceExceptions
может случиться, является (неправильное) использование оператора as
:
class Book {
public string Name { get; set; }
}
class Car { }
Car mycar = new Car();
Book mybook = mycar as Book; // Incompatible conversion --> mybook = null
Console.WriteLine(mybook.Name); // NullReferenceException
Здесь Book
и Car
являются несовместимыми типами; a Car
не может быть преобразован / передан в Book
. Когда этот сбой завершается неудачно, as
возвращает null
. Используя mybook
после этого, вы вызываете NullReferenceException
.
В общем случае вы должны использовать cast или as
, как показано ниже:
Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:
ComicBook cb = (ComicBook)specificBook;
Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as
:
ComicBook cb = specificBook as ComicBook;
if (cb != null) {
// ...
}
Я настоятельно рекомендую вам использовать класс Scanner
. Этот класс предоставляет вам такие методы, как nextInt
и т. Д.
Вы можете использовать его для чтения из файла прямо следующим образом:
Scanner s = new Scanner(new File("People.txt"));
while (s.hasNext()) {
people[i].addName(s.next());
people[i].addBookNo(s.nextInt());
people[i].addRating(s.nextInt());
}
(Просто понял, что у вас могут быть пробелы в названии. Это немного усложняет ситуацию, но я все равно буду рассматривать использование сканера.)
Альтернативным решением было бы использовать регулярное выражение и группы для синтаксического анализа части. Что-то вроде этого должно делать:
(.*?)\s+(\d+)\s+(\d+)
Следующее регулярное выражение работает в этих 3 случаях, разбивая их на 3 сопоставленные группы.
Regex (.*)\s+(\d+)\s+(\d+)
Случаи
Francis Bacon 50 2
Jill St. John 20 20
St. Francis Xavier III 3 3
Если вы хотите сделать это, вы можете попробовать сделать это следующим образом: