2010-10-06 2 views
2

Почему статические методы не будут вызывать исключение NullReferenceException? или это вызовет исключение NullReferenceException? Если он не выкинет ошибку, может кто-нибудь объяснить, почему в соответствующем примере.Почему статические методы не выбрасывают исключение NullReferenceException?

ответ

8

Статические методы не относятся к экземпляру типа, поэтому ссылка на потенциально не указана.

Конечно, если тело статического метода делает то, что, как правило, бросить исключение, оно будет распространяться как обычно:

class Test 
{ 
    static void Main() 
    { 
     GoBang(); 
    } 

    static void GoBang() 
    { 
     string s = null; 
     int y = s.Length; // Bang! NullReferenceException 
    } 
} 
+0

skeet: thanks budy – selvaraj

+0

Как насчет 'SomeClass o = null; o.StaticMethod(); 'в языках, которые позволяют вам вызвать статические методы через экземпляр? –

+0

@Bart: Такие языки следует снимать :(В этом случае (по крайней мере, для Java) статический метод определяется во время компиляции, а значение времени выполнения игнорируется ... оно никогда не * на самом деле * разыменовано, поэтому нет никакого исключения. –

1

статический метод называют с классом, который никогда не является null. Методы экземпляра вызываются с экземпляром, который может быть null, поскольку программист не сделал new на нем.

0

CLR считает, что любой тип нестабилен, если он генерирует необработанное исключение (любого вида) в конструкторе типа. Попытка доступа к любому члену нестабильного типа вызовет исключение TypeInitializationException.

Таким образом, исключение NullReferenceException будет выбрано, но оно будет обработано в результате исключения TypeInitializationException.