Почему статические методы не будут вызывать исключение NullReferenceException? или это вызовет исключение NullReferenceException? Если он не выкинет ошибку, может кто-нибудь объяснить, почему в соответствующем примере.Почему статические методы не выбрасывают исключение NullReferenceException?
ответ
Статические методы не относятся к экземпляру типа, поэтому ссылка на потенциально не указана.
Конечно, если тело статического метода делает то, что, как правило, бросить исключение, оно будет распространяться как обычно:
class Test
{
static void Main()
{
GoBang();
}
static void GoBang()
{
string s = null;
int y = s.Length; // Bang! NullReferenceException
}
}
статический метод называют с классом, который никогда не является null
. Методы экземпляра вызываются с экземпляром, который может быть null
, поскольку программист не сделал new
на нем.
CLR считает, что любой тип нестабилен, если он генерирует необработанное исключение (любого вида) в конструкторе типа. Попытка доступа к любому члену нестабильного типа вызовет исключение TypeInitializationException.
Таким образом, исключение NullReferenceException будет выбрано, но оно будет обработано в результате исключения TypeInitializationException.
skeet: thanks budy – selvaraj
Как насчет 'SomeClass o = null; o.StaticMethod(); 'в языках, которые позволяют вам вызвать статические методы через экземпляр? –
@Bart: Такие языки следует снимать :(В этом случае (по крайней мере, для Java) статический метод определяется во время компиляции, а значение времени выполнения игнорируется ... оно никогда не * на самом деле * разыменовано, поэтому нет никакого исключения. –