Object reference not set to an instance of an object код ошибки 9 перевод

Что за ошибка: Object reference not set to an instance of an object? Unity, Unity3D Решение и ответ на вопрос 1708696

VolKra

5 / 5 / 1

Регистрация: 25.07.2014

Сообщений: 223

1

11.04.2016, 12:38. Показов 100037. Ответов 11

Метки нет (Все метки)


NullReferenceException: Object reference not set to an instance of an object
bullet.Update () (at Assets/Script/bullet.cs:27)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using UnityEngine;
using System.Collections;
 
public class bullet : MonoBehaviour {
 
    public Transform bullets;
    public Transform spawns;
    private float seeDistance = 20f;
    public float attackDistance = 20f;
    public float speed = 6;
    private Transform targets;
 
    void Shoot()
    {
        Transform fire = (Transform)Instantiate(bullets, spawns.position, spawns.rotation);
        fire.LookAt(targets);
        fire.transform.Translate(new Vector3(0, 0, speed * Time.deltaTime));
    }
 
    // Use this for initialization
    void Start () {
        targets = GameObject.FindWithTag("Enemy").transform;
    }
    
    // Update is called once per frame
    void Update () {
        if (Vector3.Distance(transform.position, targets.transform.position) < seeDistance)
        {
            if (Vector3.Distance(transform.position, targets.transform.position) > attackDistance)
            {
                transform.LookAt(targets.transform);
                Shoot();
            }
        }
        else {
 
        }
 
    }
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



751 / 599 / 203

Регистрация: 06.08.2015

Сообщений: 2,432

11.04.2016, 13:10

2

Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

VolKra, эта ошибка указывает, что ссылка на объект не существует. Запомните уже
GameObject.FindWithTag(«Enemy») не находит объект, проверяйте теги у префаба.



0



5 / 5 / 1

Регистрация: 25.07.2014

Сообщений: 223

11.04.2016, 13:38

 [ТС]

3

Cr0c, Тег у префаба верний в том то и дело. Префаб создается каждою секунду. Что делать.

Добавлено через 6 минут
Cr0c, Виправил, другая ошибка теперь вилазит
UnassignedReferenceException: The variable targets of bullet has not been assigned.
You probably need to assign the targets variable of the bullet script in the inspector.
bullet.Update () (at Assets/Script/bullet.cs:26)



0



751 / 599 / 203

Регистрация: 06.08.2015

Сообщений: 2,432

11.04.2016, 14:54

4

VolKra, новый скрипт не видно, а телепаты в отпуске.



0



5 / 5 / 1

Регистрация: 25.07.2014

Сообщений: 223

11.04.2016, 15:40

 [ТС]

5

Cr0c, Ошибка в том же скрипте



0



751 / 599 / 203

Регистрация: 06.08.2015

Сообщений: 2,432

11.04.2016, 15:58

6

VolKra, а строка 26 не входит в апдейт. Между строк ошибка, что ли? Ищите переменную target, она не задана, так в ошибке указано. Возможно потому, что в момент запуска скрипта нет врага, которого можно найти. Обновляйте target в апдейте, если он null.



0



5 / 5 / 1

Регистрация: 25.07.2014

Сообщений: 223

11.04.2016, 18:02

 [ТС]

7

Cr0c, Все исправил, толька когда видет врага пуля не стреляет в нево, префаб задал всьо задал ошибки нет пуля не стреляет что делать? Ето код)



0



751 / 599 / 203

Регистрация: 06.08.2015

Сообщений: 2,432

11.04.2016, 18:26

8

VolKra, а кто двигает пулю?



0



5 / 5 / 1

Регистрация: 25.07.2014

Сообщений: 223

11.04.2016, 23:58

 [ТС]

9

Cr0c, По сути пуля должна створится и двигатся к ближайшему врагу с тегом Enemy. Как ето сделать) Помоги плиз)



0



Cr0c

751 / 599 / 203

Регистрация: 06.08.2015

Сообщений: 2,432

12.04.2016, 07:47

10

VolKra, при инстанцировании поворачивайте пулю, в скрипте пули делайте сдвиг в апдейте

C#
1
this.transform.Translate( this.transform.forward *speed * Time.deltaTime);

Но это неправильно: так как пуля будет попадать в коллайдер, то вешать на пулю ригидбоди и после поворота пули задавать её скорость через

C#
1
fire.GetComponent<Rigidbody>().velocity = fire.transform.forward * speed;

и она будет лететь до коллизии, которую обрабатывать в самой пуле.



0



5 / 5 / 1

Регистрация: 25.07.2014

Сообщений: 223

12.04.2016, 11:13

 [ТС]

11

Cr0c, Пуля не летит за юнитами. И она летит толька вверх.
Пожалуста)) Напиши весь скрипт, бо я так не понимаю….



0



Cr0c

751 / 599 / 203

Регистрация: 06.08.2015

Сообщений: 2,432

12.04.2016, 15:57

12

Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

C#
1
2
3
4
5
6
void Shoot()
    {
        Transform fire = (Transform)Instantiate(bullets, spawns.position, spawns.rotation);
        fire.LookAt(targets);
        fire.GetComponent<Rigidbody>().velocity = fire.transform.forward * speed;
    }

И на пуле должен быть Rigidbody с отключенной гравитацией, коллайдер с isTrigger и скриптом, в котором есть OnTriggerEnter

Добавлено через 3 часа 6 минут
Учиться надо, потому что в определённый момент Вы поймете, что вообще не знаете что это и как оно работает



1



  

VitaminC

13.01.10 — 17:11

Разработано приложение на базе веб-расширения. Периодически, на разных этапах, безо всякой системы выпадает ошибка:

Server Error in ‘/’ Application.

———————————————————————————

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Простое обновление страницы несколько раз отрабатывает нормально, потом выдает вышеуказанную ошибку. Причем в разных местах, на разных объектах одного модуля. Поиск по форумам ничего не дал к сожалению. Кто сталкивался с этой проблемой, поделитесь соображениями.

  

1c_asp

1 — 13.01.10 — 17:14

С проблемой сталкивался. Конкретного рецепта предложить к сожалению не могу. Я переписывал куски кода, где вываливалась эта ошибка. Как правило там были некоторые косяки.

После этого такое сообщение стало вылазить крайне редко.

Еще такое вроде бывает, когда кончается тайм аут сессии. Я это борол достаточно сложно, переписыванием всех коннектов к базе на собственный код и хранением параметров соединения в параметрах сессии

  

AquaKosh

2 — 13.01.10 — 17:40

(0) Чувство у меня такое, что временами где-то NULL появляется вместо объекта…

  

VitaminC

3 — 13.01.10 — 17:40

>Как правило там были некоторые косяки.

Какого рода косяки? Что примерно искать нужно?

У меня тоже код в основном собственный, с созданием коннектов и работы с объектами. Возможно из-за малого опыта в веб-программировании и криво что-то написал. Но по этой ошибке никаких выводов сделать не могу. Не пойму даже в какую сторону думать (

Что интересно, на своем сервере ни разу ни удалось получить эту ошибку. У клиента — вываливается регулярно.

  

VitaminC

4 — 13.01.10 — 17:42

(2) Да, ссылка явно пустая получается. Но как? Почему? Почему посреди модуля (часть кода успевает отработать)?

  

1c_asp

5 — 13.01.10 — 17:46

(2) Точнее не NULL а неспозиционированный объект

  

1c_asp

6 — 13.01.10 — 17:48

В какой функции у тебя эта ошибка вываливается ? Попробуй переместить в другую функцию, выполняющуюся позже. Например из OnLoad в PreRender

  

1c_asp

7 — 13.01.10 — 17:49

Припоминаю, кажется были у меня такие ошибки. Возникали непонятно откуда и непонятно как раньше работали. Лечились, насколько помню именно через (5)

  

VitaminC

8 — 13.01.10 — 18:13

(6) Page_Load

(7) Что значит через (5)? Вот допустим на строке reader = (V8DataReader)cmd.ExecuteReader(); спотыкается, проверю я на Null, и что делать дальше? Еще раз пытаться отработать код с начала?

  

1c_asp

9 — 14.01.10 — 10:48

(8) А connection для этого cmd ты откуда берешь ?

  

VitaminC

10 — 14.01.10 — 12:51

static V8DbConnection connection = new V8DbConnection();

   protected void Page_Load(object sender, EventArgs e)

   {

   if (connection.State==ConnectionState.Closed)

       {

           connection.Database = V8Metadata.GetDatabase(«»);

           connection.User = Session[WebConsts.UserName].ToString();

           connection.Password = Session[WebConsts.UserPassword].ToString();

           connection.Open();

       }

   …

   try

       {

           V8DbSelectCommand cmd = new V8DbSelectCommand();

           cmd.CommandType = CommandType.Text;

           cmd.Connection = connection;

           cmd.CommandText = @»

                   ВЫБРАТЬ ПЕРВЫЕ 1 Сотрудник,

           …

           reader = (V8DataReader)cmd.ExecuteReader();

           …

           ((IDisposable)reader).Dispose();

           cmd.CommandText = @»

           ВЫБРАТЬ

                   Хозрасчетный.Регистратор.Дата КАК Дата,

           …

           reader = (V8DataReader)cmd.ExecuteReader();

           …

           ((IDisposable)reader).Dispose();

           …

       } // try

       finally

       {

           connection.Close();

       }

   }

  

1c_asp

11 — 14.01.10 — 14:32

(10)
    }
   … <а вот тут потеряться коннекшн не может ?>
   try

  

1c_asp

12 — 14.01.10 — 14:42

А на каких точно строках падает можешь сказать ?

  

VitaminC

13 — 14.01.10 — 18:30

(11) По логике программы — нет, вот тот кусок:

       RadioButton1.Text = БазовыйПериод.AddMonths(-1).ToString(«MMMM», ru);

       RadioButton2.Text = БазовыйПериод.ToString(«MMMM», ru);

       Период = new DateTime(БазовыйПериод.Year, БазовыйПериод.Month, 1);

       if (RadioButton1.Checked) Период = Период.AddMonths(-1);

       ПериодКонец = Период.AddMonths(1).AddSeconds(-1);

Я многоточиями заменил получение/обработку данных, на которых по идее ничего такого случаться не должно, чтоб код более читаемый был.

(12) На всех строчках reader = (V8DataReader)cmd.ExecuteReader() (их там 6 штук), иногда на строках:

           ИнтерфейсРуководителя = (bool)V8.Call(connection.Connection, «WebИнтерфейсРуководителя», Context.User.Identity.Name.ToString());

           ПользовательРуководитель = (bool)V8.Call(connection.Connection, «WebПользовательРуководитель», Context.User.Identity.Name.ToString());

но тут другая ошибка: External component has thrown an exception. Причем эти строки идут подряд, иногда падает на первой, иногда на второй. Сам понимаешь, между ними ничего не происходит, точнее не должно происходить неординарного.

  

1c_asp

14 — 14.01.10 — 18:43

(13) Ну тогда, кроме как окропить сервер святой водой, у меня идей нет.

ExecuteReader у меня никогда не падал без ошибки в коде

  

VitaminC

15 — 14.01.10 — 18:56

Спасибо что попытался помочь. На других форумах и в партнерском вообще ничего..

  

1c_asp

16 — 14.01.10 — 19:17

Можно попробовать пошаманить — подвигать код в функции, выполняющиеся позднее. Например в PreRender. Мне пару раз такое шаманство помогло при непонятных косяках

  

1c_asp

17 — 14.01.10 — 19:21

еще не уверен, а точно нужна static ?
V8DbConnection connection

Я в каждой функции заново открываю соединение, тормозов нет, т.к. все равно используется кэш.

  

VitaminC

18 — 14.01.10 — 19:47

Да, статик остался от старых экспериментов, когда я пытался увеличиить производительность. Почему-то не всегда использует кэшированные соединения, иногда создает новые, из-за чего тормоза. Статик не нужен, уберу.

  

1c_asp

19 — 15.01.10 — 10:39

(18) Новое соединение создается тогда, когда идет утечка памяти. Крайне рекомендую включить контроль освобождения объектов (как это сделать написано в самом конце книге о web расширении)

  

VitaminC

20 — 15.01.10 — 12:06

Трассировка неосвобожденных объектов по дефолту включена у меня на сервере разработки для всех проектов, тут дело в чем-то другом.

NullReferenceException возникает, когда вы пытаетесь получить доступ к ссылочной переменной, которая не ссылается на какой-либо объект. Если ссылочная переменная не ссылается на объект, она будет рассматриваться как null. Время выполнения сообщит вам, что вы пытаетесь получить доступ к объекту, когда переменная имеет значение null, создав исключение NullReferenceException.

Ссылочные переменные в C# и JavaScript по своей концепции аналогичны указателям в C и C++. Типы ссылок по умолчанию имеют значение null, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаются, а его нет, вы получите NullReferenceException.

Когда вы получаете NullReferenceException в своем коде, это означает, что вы забыли установить переменную перед ее использованием. Сообщение об ошибке будет выглядеть примерно так:

NullReferenceException: Object reference not set to an instance of an object
at Example.Start () [0x0000b] in /Unity/projects/nre/Assets/Example.cs:10

В этом сообщении об ошибке говорится, что NullReferenceException произошло в строке 10 файла сценария Example.cs. Кроме того, в сообщении говорится, что исключение произошло внутри функции Start(). Это упрощает поиск и исправление исключения нулевой ссылки. В этом примере код такой:

//c# example
using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {

// Use this for initialization
void Start () {
__GameObject__The fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject's functionality is defined by the Components attached to it. [More info](class-GameObject)See in [Glossary](Glossary#GameObject) go = GameObject.Find("wibble");
Debug.Log(go.name);
}

}

Код просто ищет игровой объект под названием «wibble». В этом примере нет игрового объекта с таким именем, поэтому функция Find() возвращает null. В следующей строке (строка 9) мы используем переменную go и пытаемся вывести имя игрового объекта, на который она ссылается. Поскольку мы обращаемся к несуществующему игровому объекту, среда выполнения выдает нам NullReferenceException

Нулевые проверки

Хотя это может расстраивать, когда это происходит, это просто означает, что сценарий должен быть более осторожным. Решение в этом простом примере состоит в том, чтобы изменить код следующим образом:

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {

void Start () {
GameObject go = GameObject.Find("wibble");
if (go) {
Debug.Log(go.name);
} else {
Debug.Log("No game object called wibble found");
}
}

}

Теперь, прежде чем пытаться что-то делать с переменной go, мы проверяем, не является ли она null. Если это null, мы показываем сообщение.

Попробовать/перехватить блоки

Другой причиной NullReferenceException является использование переменной, которая должна быть инициализирована в ИнспектореОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в Словарь
. Если вы забудете это сделать, переменная будет иметь значение null. Другой способ справиться с NullReferenceException — использовать блок try/catch. Например, этот код:

using UnityEngine;
using System;
using System.Collections;

public class Example2 : MonoBehaviour {

public Light myLight; // set in the inspector

void Start () {
try {
myLight.color = Color.yellow;
}
catch (NullReferenceException ex) {
Debug.Log("myLight was not set in the inspector");
}
}

}

В этом примере кода переменная с именем myLight — это Light, которую следует установить в окне инспектора. Если эта переменная не задана, по умолчанию она будет иметь значение null. Попытка изменить цвет света в блоке try вызывает NullReferenceException, которое подхватывается блоком catch. Блок catch отображает сообщение, которое может быть более полезным для художников и геймдизайнеров, и напоминает им о необходимости установить свет в инспекторе.

Обзор

  • NullReferenceException возникает, когда ваш код скрипта пытается использовать переменную, которая не установлена ​​(ссылка) и объект.
  • Отображаемое сообщение об ошибке многое говорит о том, в каком месте кода возникает проблема.
  • NullReferenceException можно избежать, написав код, который проверяет null перед доступом к объекту или использует блоки try/catch.

Причина

Вкратце

Вы пытаетесь воспользоваться чем-то, что равно null (или Nothing в VB.NET). Это означает, что либо вы присвоили это значение, либо вы ничего не присваивали.

Как и любое другое значение, null может передаваться от объекта к объекту, от метода к методу. Если нечто равно null в методе «А», вполне может быть, что метод «В» передал это значение в метод «А».

Остальная часть статьи описывает происходящее в деталях и перечисляет распространённые ошибки, которые могут привести к исключению NullReferenceException.

Более подробно

Если среда выполнения выбрасывает исключение NullReferenceException, то это всегда означает одно: вы пытаетесь воспользоваться ссылкой. И эта ссылка не инициализирована (или была инициализирована, но уже не инициализирована).

Это означает, что ссылка равна null, а вы не сможете вызвать методы через ссылку, равную null. В простейшем случае:

string foo = null;
foo.ToUpper();

Этот код выбросит исключение NullReferenceException на второй строке, потому что вы не можете вызвать метод ToUpper() у ссылки на string, равной null.

Отладка

Как определить источник ошибки? Кроме изучения, собственно, исключения, которое будет выброшено именно там, где оно произошло, вы можете воспользоваться общими рекомендациями по отладке в Visual Studio: поставьте точки останова в ключевых точках, изучите значения переменных, либо расположив курсор мыши над переменной, либо открыв панели для отладки: Watch, Locals, Autos.

Если вы хотите определить место, где значение ссылки устанавливается или не устанавливается, нажмите правой кнопкой на её имени и выберите «Find All References». Затем вы можете поставить точки останова на каждой найденной строке и запустить приложение в режиме отладки. Каждый раз, когда отладчик остановится на точке останова, вы можете удостовериться, что значение верное.

Следя за ходом выполнения программы, вы придёте к месту, где значение ссылки не должно быть null, и определите, почему не присвоено верное значение.

Примеры

Несколько общих примеров, в которых возникает исключение.

Цепочка

ref1.ref2.ref3.member

Если ref1, ref2 или ref3 равно null, вы получите NullReferenceException. Для решения проблемы и определения, что именно равно null, вы можете переписать выражение более простым способом:

var r1 = ref1;
var r2 = r1.ref2;
var r3 = r2.ref3;
r3.member

Например, в цепочке HttpContext.Current.User.Identity.Name, значение может отсутствовать и у HttpContext.Current, и у User, и у Identity.

Неявно

public class Person {
    public int Age { get; set; }
}
public class Book {
    public Person Author { get; set; }
}
public class Example {
    public void Foo() {
        Book b1 = new Book();
        int authorAge = b1.Author.Age; // Свойство Author не было инициализировано
                                       // нет Person, у которого можно вычислить Age.
    }
}

То же верно для вложенных инициализаторов:

Book b1 = new Book { Author = { Age = 45 } };

Несмотря на использование ключевого слова new, создаётся только экземпляр класса Book, но экземпляр Person не создаётся, поэтому свойство Author остаётся null.

Массив

int[] numbers = null;
int n = numbers[0]; // numbers = null. Нет массива, чтобы получить элемент по индексу

Элементы массива

Person[] people = new Person[5];
people[0].Age = 20; // people[0] = null. Массив создаётся, но не
                    // инициализируется. Нет Person, у которого можно задать Age.

Массив массивов

long[][] array = new long[1][];
array[0][0] = 3; // = null, потому что инициализировано только первое измерение.
                 // Сначала выполните array[0] = new long[2].

Collection/List/Dictionary

Dictionary<string, int> agesForNames = null;
int age = agesForNames["Bob"]; // agesForNames = null.
                               // Экземпляр словаря не создан.

LINQ

public class Person {
    public string Name { get; set; }
}
var people = new List<Person>();
people.Add(null);
var names = from p in people select p.Name;
string firstName = names.First(); // Исключение бросается здесь, хотя создаётся
                                  // строкой выше. p = null, потому что
                                  // первый добавленный элемент = null.

События

public class Demo
{
    public event EventHandler StateChanged;

    protected virtual void OnStateChanged(EventArgs e)
    {        
        StateChanged(this, e); // Здесь бросится исключение, если на
                               // событие StateChanged никто не подписался
    }
}

Неудачное именование переменных

Если бы в коде ниже у локальных переменных и полей были разные имена, вы бы обнаружили, что поле не было инициализировано:

public class Form1 {
    private Customer customer;

    private void Form1_Load(object sender, EventArgs e) {
        Customer customer = new Customer();
        customer.Name = "John";
    }

    private void Button_Click(object sender, EventArgs e) {
        MessageBox.Show(customer.Name);
    }
}

Можно избежать проблемы, если использовать префикс для полей:

private Customer _customer;

Цикл жизни страницы ASP.NET

public partial class Issues_Edit : System.Web.UI.Page
{
    protected TestIssue myIssue;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Выполняется только на первой загрузке, но не когда нажата кнопка
            myIssue = new TestIssue(); 
        }
    }
    
    protected void SaveButton_Click(object sender, EventArgs e)
    {
        myIssue.Entry = "NullReferenceException здесь!";
    }
}

Сессии ASP.NET

// Если сессионная переменная "FirstName" ещё не была задана,
// то эта строка бросит NullReferenceException.
string firstName = Session["FirstName"].ToString();

Пустые вью-модели ASP.NET MVC

Если вы возвращаете пустую модель (или свойство модели) в контроллере, то вью бросит исключение при попытке доступа к ней:

// Controller
public class Restaurant:Controller
{
    public ActionResult Search()
    {
         return View();  // Модель не задана.
    }
}

// Razor view 
@foreach (var restaurantSearch in Model.RestaurantSearch)  // Исключение.
{
}

Способы избежать

Явно проверять на null, пропускать код

Если вы ожидаете, что ссылка в некоторых случаях будет равна null, вы можете явно проверить на это значение перед доступом к членам экземпляра:

void PrintName(Person p) {
    if (p != null) {
        Console.WriteLine(p.Name);
    }
}

Явно проверять на null, использовать значение по умолчанию

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

string GetCategory(Book b) {
    if (b == null)
        return "Unknown";
    return b.Category;
}

Явно проверять на null, выбрасывать своё исключение

Вы также можете бросать своё исключение, чтобы позже его поймать:

string GetCategory(string bookTitle) {
    var book = library.FindBook(bookTitle);  // Может вернуть null
    if (book == null)
        throw new BookNotFoundException(bookTitle);  // Ваше исключение
    return book.Category;
}

Использовать Debug.Assert для проверки на null для обнаружения ошибки до бросания исключения

Если во время разработки вы знаете, что метод может, но вообще-то не должен возвращать null, вы можете воспользоваться Debug.Assert для быстрого обнаружения ошибки:

string GetTitle(int knownBookID) {
    // Вы знаете, что метод не должен возвращать null
    var book = library.GetBook(knownBookID);  

    // Исключение будет выброшено сейчас, а не в конце метода.
    Debug.Assert(book != null, "Library didn't return a book for known book ID.");

    // Остальной код...

    return book.Title; // Не выбросит NullReferenceException в режиме отладки.
}

Однако эта проверка не будет работать в релизной сборке, и вы снова получите NullReferenceException, если book == null.

Использовать GetValueOrDefault() для Nullable типов

DateTime? appointment = null;
Console.WriteLine(appointment.GetValueOrDefault(DateTime.Now));
// Отобразит значение по умолчанию, потому что appointment = null.

appointment = new DateTime(2022, 10, 20);
Console.WriteLine(appointment.GetValueOrDefault(DateTime.Now));
// Отобразит дату, а не значение по умолчанию.

Использовать оператор ?? (C#) или If() (VB)

Краткая запись для задания значения по умолчанию:

IService CreateService(ILogger log, Int32? frobPowerLevel)
{
    var serviceImpl = new MyService(log ?? NullLog.Instance);
    serviceImpl.FrobPowerLevel = frobPowerLevel ?? 5;
}

Использовать операторы ?. и ?[ (C# 6+, VB.NET 14+):

Это оператор безопасного доступа к членам, также известный как оператор Элвиса за специфическую форму. Если выражение слева от оператора равно null, то правая часть игнорируется, и результатом считается null. Например:

var title = person.Title.ToUpper();

Если свойство Title равно null, то будет брошено исключение, потому что это попытка вызвать метод ToUpper на значении, равном null. В C# 5 и ниже можно добавить проверку:

var title = person.Title == null ? null : person.Title.ToUpper();

Теперь вместо бросания исключения переменной title будет присвоено null. В C# 6 был добавлен более короткий синтаксис:

var title = person.Title?.ToUpper();

Разумеется, если переменная person может быть равна null, то надо проверять и её. Также можно использовать операторы ?. и ?? вместе, чтобы предоставить значение по умолчанию:

// обычная проверка на null
int titleLength = 0;
if (title != null)
    titleLength = title.Length;

// совмещаем операторы `?.` и `??`
int titleLength = title?.Length ?? 0;

Если любой член в цепочке может быть null, то можно полностью обезопасить себя (хотя, конечно, архитектуру стоит поставить под сомнение):

int firstCustomerOrderCount = customers?[0]?.Orders?.Count() ?? 0;

Object reference not set to an instance of an object error is one of the most common errors when developing .NET applications. Here are the five most common mistakes that result in this error. In this article, also learn how to fix errors, and object references not set to an instance of an object.

Why does this error happen?

This error’s description speaks for itself but when you do not have much experience in development, it is very difficult to understand. So, this error description says that an object that is being called to get or set its value has no reference. This means that you are trying to access an object that was not instantiated.

Why should I know this?

This is important in order to avoid runtime errors that could possibly expose your sensitive data and this could lead to a vulnerability breach. Vulnerability breaches are usually used by hackers for a cyber attack to steal your data or to take your server offline.

How to avoid exposing code and entities?

You must always wrap code that could possibly throw an exception inside try-catch blocks. There are others security approaches that you can use to protect your data that can be found here.

Common mistakes

Objects used in this sample.

Controller

  1. public class HomeController : Controller  
  2.    {  
  3.        SampleObj sampleObj;  
  4.        SampleChildObj sampleChild;  
  5.        List<string> lstSample;  
  6.        public IActionResult Index()  
  7.        {  
  8.            return View();  
  9.        }  
  10.   
  11.        public IActionResult About()  
  12.        {  
  13.            ViewData[«Message»] = «Your application description page.»;  
  14.   
  15.            return View();  
  16.        }  
  17.   
  18.        public IActionResult Contact()  
  19.        {  
  20.            ViewData[«Message»] = «Your contact page.»;  
  21.   
  22.            return View();  
  23.        }  
  24.   
  25.        public IActionResult Error()  
  26.        {  
  27.            return View();  
  28.        }  
  29.        public IActionResult NewObject()  
  30.        {  
  31.            sampleChild.Item2 = «error»;  
  32.            return View();  
  33.        }  
  34.   
  35.        public IActionResult ConditionStatement()  
  36.        {  
  37.            if (true == false)  
  38.            {  
  39.                sampleChild = new SampleChildObj();  
  40.                sampleChild.Item2 = «»;  
  41.            }  
  42.            else  
  43.                sampleChild.Item2 = «error»;  
  44.   
  45.            return View();  
  46.        }  
  47.        public IActionResult ObjectInsideObject()  
  48.        {  
  49.            sampleObj = new SampleObj();  
  50.            sampleObj.ChildObj.Item2 = «error»;  
  51.            return View();  
  52.        }  
  53.        public IActionResult AddInNullList()  
  54.        {  
  55.            lstSample.Add(«error»);  
  56.            return View();  
  57.        }  
  58.    }  

Classes

  1. public class SampleObj  
  2. {  
  3.   
  4.     public string Item1 { get; set; }  
  5.     public SampleChildObj ChildObj { get; set; }  
  6. }  
  7. public class SampleChildObj   
  8. {  
  9.     public string Item2 { get; set; }  
  10. }  

New object not instantiated

Practical example,

Here, we have a sample situation of when we have this error.

  1. public IActionResult NewObject()  
  2. {  
  3.     sampleChild.Item2 = «error»;  
  4.     return View();  
  5. }  

This happens when you create a new object but do not instantiate it before getting/setting a value.

Condition statement(if, switch)

Practical example

Here, we have a sample situation of when we have this error,

  1. public IActionResult ConditionStatement()  
  2. {  
  3.     if (true == false)  
  4.     {  
  5.         sampleChild = new SampleChildObj();  
  6.         sampleChild.Item2 = «»;  
  7.     }  
  8.     else  
  9.         sampleChild.Item2 = «error»;  
  10.   
  11.     return View();  
  12. }  

Why does this happen?

This is a very common mistake. It happens when you create an object that is going to be instantiated inside a conditional statement but forgets to instantiate it in one of the conditions and try to read/write on it.

Object Inside Object

Practical Example

Here, we have a sample situation of when we have this error:

  1. public IActionResult ObjectInsideObject()  
  2. {  
  3.     sampleObj = new SampleObj();  
  4.     sampleObj.ChildObj.Item2 = «error»;  
  5.     return View();  
  6. }  

Why Does This Happens?

It happens when you have an object with many child objects. So, you instantiate the main object but forget to instantiate its child before trying to get/set its value.

Add an item in a null list

Practical Example

Here we have a sample situation of when we have this error,

  1. public IActionResult AddInNullList()  
  2. {  
  3.     lstSample.Add(«error»);  
  4.     return View();  

Why does this happen?

When you are trying to read/write data in a list that was not instantiated before.

Important

  1. In order to avoid exposing your data, you must always handle exceptions. Read more about how to do that here. 
  2. The items listed above are some of the most common ways to throw this type of error but there are many other situations in which we may face it. Always remember to check if your objects are instantiated before reading or writing data into them.

Best practices

  • Tips about commenting your code, making it more readable in order to help others developers to understand it.
  • Object naming practices, create a pattern to name variables, services, and methods.
  • Handling errors to not show sensitive data to your users.
  • Security tricks to protect your data.
  • Reading/writing data without breaking your architecture.

*I am planning to write more about common mistakes and share tips to improve code quality. If you have any specific topic that you would like to read here, please write it below in the comments section.

Congratulations! You just learned how to deal with the most common daily mistakes.

Download the code from GitHub here.

Object reference not set to an instance of an object error is one of the most common errors when developing .NET applications. Here are the five most common mistakes that result in this error. In this article, also learn how to fix errors, and object references not set to an instance of an object.

Why does this error happen?

This error’s description speaks for itself but when you do not have much experience in development, it is very difficult to understand. So, this error description says that an object that is being called to get or set its value has no reference. This means that you are trying to access an object that was not instantiated.

Why should I know this?

This is important in order to avoid runtime errors that could possibly expose your sensitive data and this could lead to a vulnerability breach. Vulnerability breaches are usually used by hackers for a cyber attack to steal your data or to take your server offline.

How to avoid exposing code and entities?

You must always wrap code that could possibly throw an exception inside try-catch blocks. There are others security approaches that you can use to protect your data that can be found here.

Common mistakes

Objects used in this sample.

Controller

  1. public class HomeController : Controller  
  2.    {  
  3.        SampleObj sampleObj;  
  4.        SampleChildObj sampleChild;  
  5.        List<string> lstSample;  
  6.        public IActionResult Index()  
  7.        {  
  8.            return View();  
  9.        }  
  10.   
  11.        public IActionResult About()  
  12.        {  
  13.            ViewData[«Message»] = «Your application description page.»;  
  14.   
  15.            return View();  
  16.        }  
  17.   
  18.        public IActionResult Contact()  
  19.        {  
  20.            ViewData[«Message»] = «Your contact page.»;  
  21.   
  22.            return View();  
  23.        }  
  24.   
  25.        public IActionResult Error()  
  26.        {  
  27.            return View();  
  28.        }  
  29.        public IActionResult NewObject()  
  30.        {  
  31.            sampleChild.Item2 = «error»;  
  32.            return View();  
  33.        }  
  34.   
  35.        public IActionResult ConditionStatement()  
  36.        {  
  37.            if (true == false)  
  38.            {  
  39.                sampleChild = new SampleChildObj();  
  40.                sampleChild.Item2 = «»;  
  41.            }  
  42.            else  
  43.                sampleChild.Item2 = «error»;  
  44.   
  45.            return View();  
  46.        }  
  47.        public IActionResult ObjectInsideObject()  
  48.        {  
  49.            sampleObj = new SampleObj();  
  50.            sampleObj.ChildObj.Item2 = «error»;  
  51.            return View();  
  52.        }  
  53.        public IActionResult AddInNullList()  
  54.        {  
  55.            lstSample.Add(«error»);  
  56.            return View();  
  57.        }  
  58.    }  

Classes

  1. public class SampleObj  
  2. {  
  3.   
  4.     public string Item1 { get; set; }  
  5.     public SampleChildObj ChildObj { get; set; }  
  6. }  
  7. public class SampleChildObj   
  8. {  
  9.     public string Item2 { get; set; }  
  10. }  

New object not instantiated

Practical example,

Here, we have a sample situation of when we have this error.

  1. public IActionResult NewObject()  
  2. {  
  3.     sampleChild.Item2 = «error»;  
  4.     return View();  
  5. }  

This happens when you create a new object but do not instantiate it before getting/setting a value.

Condition statement(if, switch)

Practical example

Here, we have a sample situation of when we have this error,

  1. public IActionResult ConditionStatement()  
  2. {  
  3.     if (true == false)  
  4.     {  
  5.         sampleChild = new SampleChildObj();  
  6.         sampleChild.Item2 = «»;  
  7.     }  
  8.     else  
  9.         sampleChild.Item2 = «error»;  
  10.   
  11.     return View();  
  12. }  

Why does this happen?

This is a very common mistake. It happens when you create an object that is going to be instantiated inside a conditional statement but forgets to instantiate it in one of the conditions and try to read/write on it.

Object Inside Object

Practical Example

Here, we have a sample situation of when we have this error:

  1. public IActionResult ObjectInsideObject()  
  2. {  
  3.     sampleObj = new SampleObj();  
  4.     sampleObj.ChildObj.Item2 = «error»;  
  5.     return View();  
  6. }  

Why Does This Happens?

It happens when you have an object with many child objects. So, you instantiate the main object but forget to instantiate its child before trying to get/set its value.

Add an item in a null list

Practical Example

Here we have a sample situation of when we have this error,

  1. public IActionResult AddInNullList()  
  2. {  
  3.     lstSample.Add(«error»);  
  4.     return View();  

Why does this happen?

When you are trying to read/write data in a list that was not instantiated before.

Important

  1. In order to avoid exposing your data, you must always handle exceptions. Read more about how to do that here. 
  2. The items listed above are some of the most common ways to throw this type of error but there are many other situations in which we may face it. Always remember to check if your objects are instantiated before reading or writing data into them.

Best practices

  • Tips about commenting your code, making it more readable in order to help others developers to understand it.
  • Object naming practices, create a pattern to name variables, services, and methods.
  • Handling errors to not show sensitive data to your users.
  • Security tricks to protect your data.
  • Reading/writing data without breaking your architecture.

*I am planning to write more about common mistakes and share tips to improve code quality. If you have any specific topic that you would like to read here, please write it below in the comments section.

Congratulations! You just learned how to deal with the most common daily mistakes.

Download the code from GitHub here.

   VitaminC

13.01.10 — 17:11

Разработано приложение на базе веб-расширения. Периодически, на разных этапах, безо всякой системы выпадает ошибка:

Server Error in ‘/’ Application.

———————————————————————————

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Простое обновление страницы несколько раз отрабатывает нормально, потом выдает вышеуказанную ошибку. Причем в разных местах, на разных объектах одного модуля. Поиск по форумам ничего не дал к сожалению. Кто сталкивался с этой проблемой, поделитесь соображениями.

   1c_asp

1 — 13.01.10 — 17:14

С проблемой сталкивался. Конкретного рецепта предложить к сожалению не могу. Я переписывал куски кода, где вываливалась эта ошибка. Как правило там были некоторые косяки.

После этого такое сообщение стало вылазить крайне редко.

Еще такое вроде бывает, когда кончается тайм аут сессии. Я это борол достаточно сложно, переписыванием всех коннектов к базе на собственный код и хранением параметров соединения в параметрах сессии

   AquaKosh

2 — 13.01.10 — 17:40

(0) Чувство у меня такое, что временами где-то NULL появляется вместо объекта…

   VitaminC

3 — 13.01.10 — 17:40

>Как правило там были некоторые косяки.

Какого рода косяки? Что примерно искать нужно?

У меня тоже код в основном собственный, с созданием коннектов и работы с объектами. Возможно из-за малого опыта в веб-программировании и криво что-то написал. Но по этой ошибке никаких выводов сделать не могу. Не пойму даже в какую сторону думать (

Что интересно, на своем сервере ни разу ни удалось получить эту ошибку. У клиента — вываливается регулярно.

   VitaminC

4 — 13.01.10 — 17:42

(2) Да, ссылка явно пустая получается. Но как? Почему? Почему посреди модуля (часть кода успевает отработать)?

   1c_asp

5 — 13.01.10 — 17:46

(2) Точнее не NULL а неспозиционированный объект

   1c_asp

6 — 13.01.10 — 17:48

В какой функции у тебя эта ошибка вываливается ? Попробуй переместить в другую функцию, выполняющуюся позже. Например из OnLoad в PreRender

   1c_asp

7 — 13.01.10 — 17:49

Припоминаю, кажется были у меня такие ошибки. Возникали непонятно откуда и непонятно как раньше работали. Лечились, насколько помню именно через (5)

   VitaminC

8 — 13.01.10 — 18:13

(6) Page_Load

(7) Что значит через (5)? Вот допустим на строке reader = (V8DataReader)cmd.ExecuteReader(); спотыкается, проверю я на Null, и что делать дальше? Еще раз пытаться отработать код с начала?

   1c_asp

9 — 14.01.10 — 10:48

(8) А connection для этого cmd ты откуда берешь ?

   VitaminC

10 — 14.01.10 — 12:51

static V8DbConnection connection = new V8DbConnection();



   protected void Page_Load(object sender, EventArgs e)

   {

   if (connection.State==ConnectionState.Closed)

       {

           connection.Database = V8Metadata.GetDatabase(«»);

           connection.User = Session[WebConsts.UserName].ToString();

           connection.Password = Session[WebConsts.UserPassword].ToString();

           connection.Open();

       }

   …

   try

       {

           V8DbSelectCommand cmd = new V8DbSelectCommand();

           cmd.CommandType = CommandType.Text;

           cmd.Connection = connection;

           cmd.CommandText = @»

                   ВЫБРАТЬ ПЕРВЫЕ 1 Сотрудник,

           …

           reader = (V8DataReader)cmd.ExecuteReader();

           …

           ((IDisposable)reader).Dispose();

           cmd.CommandText = @»

           ВЫБРАТЬ

                   Хозрасчетный.Регистратор.Дата КАК Дата,

           …

           reader = (V8DataReader)cmd.ExecuteReader();

           …

           ((IDisposable)reader).Dispose();

           …

       } // try

       finally

       {

           connection.Close();

       }

   }

   1c_asp

11 — 14.01.10 — 14:32

(10)
    }
   … <а вот тут потеряться коннекшн не может ?>
   try

   1c_asp

12 — 14.01.10 — 14:42

А на каких точно строках падает можешь сказать ?

   VitaminC

13 — 14.01.10 — 18:30

(11) По логике программы — нет, вот тот кусок:

       RadioButton1.Text = БазовыйПериод.AddMonths(-1).ToString(«MMMM», ru);

       RadioButton2.Text = БазовыйПериод.ToString(«MMMM», ru);

       Период = new DateTime(БазовыйПериод.Year, БазовыйПериод.Month, 1);

       if (RadioButton1.Checked) Период = Период.AddMonths(-1);

       ПериодКонец = Период.AddMonths(1).AddSeconds(-1);

Я многоточиями заменил получение/обработку данных, на которых по идее ничего такого случаться не должно, чтоб код более читаемый был.

(12) На всех строчках reader = (V8DataReader)cmd.ExecuteReader() (их там 6 штук), иногда на строках:

           ИнтерфейсРуководителя = (bool)V8.Call(connection.Connection, «WebИнтерфейсРуководителя», Context.User.Identity.Name.ToString());

           ПользовательРуководитель = (bool)V8.Call(connection.Connection, «WebПользовательРуководитель», Context.User.Identity.Name.ToString());

но тут другая ошибка: External component has thrown an exception. Причем эти строки идут подряд, иногда падает на первой, иногда на второй. Сам понимаешь, между ними ничего не происходит, точнее не должно происходить неординарного.

   1c_asp

14 — 14.01.10 — 18:43

(13) Ну тогда, кроме как окропить сервер святой водой, у меня идей нет.

ExecuteReader у меня никогда не падал без ошибки в коде

   VitaminC

15 — 14.01.10 — 18:56

Спасибо что попытался помочь. На других форумах и в партнерском вообще ничего..

   1c_asp

16 — 14.01.10 — 19:17

Можно попробовать пошаманить — подвигать код в функции, выполняющиеся позднее. Например в PreRender. Мне пару раз такое шаманство помогло при непонятных косяках

   1c_asp

17 — 14.01.10 — 19:21

еще не уверен, а точно нужна static ?
V8DbConnection connection

Я в каждой функции заново открываю соединение, тормозов нет, т.к. все равно используется кэш.

   VitaminC

18 — 14.01.10 — 19:47

Да, статик остался от старых экспериментов, когда я пытался увеличиить производительность. Почему-то не всегда использует кэшированные соединения, иногда создает новые, из-за чего тормоза. Статик не нужен, уберу.

   1c_asp

19 — 15.01.10 — 10:39

(18) Новое соединение создается тогда, когда идет утечка памяти. Крайне рекомендую включить контроль освобождения объектов (как это сделать написано в самом конце книге о web расширении)

  

VitaminC

20 — 15.01.10 — 12:06

Трассировка неосвобожденных объектов по дефолту включена у меня на сервере разработки для всех проектов, тут дело в чем-то другом.

Сама ошибка вот такая:NullReferenceException: Object reference not set to an instance of an objectGameContoller.MoveLevelTop (Level level) (at Assets/Scripts/GameContoller.cs:107)Level.LateUpdate () (at Assets/Scripts/Level.cs:48)

107 строчка — level.Setup(new Vector3(0, lastLevel.AnchoredPosition.y + lastLevel.Size.y), colors[CurrentLevel % colors.Count], CurrentLevel);

48 строчка — OnFinishLevel?.Invoke(this);

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Level : MonoBehaviour
{
public System.Action OnStartNewLevel;
public System.Action<Level> OnFinishLevel;

private RectTransform rect;
private Image image;
private bool newLevelFired;
[SerializeField] Text levelText;

public Vector3 AnchoredPosition { get { return rect.anchoredPosition3D; } set { rect.anchoredPosition3D = value;}}
public Vector2 Size { get { return rect.sizeDelta; } set { rect.sizeDelta = value; } }

public Color BackColor { get {return image.color; } set { image.color = value; } }

private void Awake() {
image = GetComponent<Image>();
rect = GetComponent<RectTransform>();
}
void Start()
{

}

// Update is called once per frame
void Update()
{
if (GameContoller.Instance.State == GameContoller.GameState.PLAY)
{
AnchoredPosition += Vector3.down * Time.deltaTime * 400;
}
}

private void LateUpdate() {
if (!newLevelFired && AnchoredPosition.y < 500)
{
OnStartNewLevel?.Invoke();
newLevelFired = true;
}
if (AnchoredPosition.y < -Size.y — 100)
{
OnFinishLevel?.Invoke(this);
}
}

public void Setup(Vector3 pos, Color color, int level)
{
newLevelFired = false;
AnchoredPosition = pos;
BackColor = color;
levelText.text = level.ToString();
}
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class GameContoller : MonoBehaviour
{
public enum GameState { START, PLAY, LOSE, GAME_OVER};
public event System.Action<GameState> OnStateChanged;
public event System.Action<int> OnCurrentLevelChanged;
public event System.Action<int> OnScoreChanged;
public System.Action<int> OnGameOver;
private GameState state;
private int currentLevel;
private int score;
[SerializeField] private Transform levelRegion = null;
[SerializeField] private Level LevelPrefab = null;
[SerializeField] private List<Color> colors = new List<Color>();
[SerializeField] private Player player;
private List<Level> levels = new List<Level>();
private List <GameObject> ObstaclePrefabs ;

public GameState State { get => state; set { state = value; OnStateChanged?.Invoke(state);} }

public int CurrentLevel { get => currentLevel; set { currentLevel = value; OnCurrentLevelChanged?.Invoke(value); } }

public int Score { get => score; set { score = value; OnScoreChanged?.Invoke(value); } }

public static GameContoller Instance;
[SerializeField] private Transform spawnRegion;
private Level lastLevel;

private void Awake()
{
Instance = this;
}

private void Start()
{
ObstaclePrefabs = Resources.LoadAll<GameObject>(«GroupObstacles»).ToList();

for (int i=0; i<2;i++)
{
levels.Add(SpawnNewLevel1());

}
ResetLevels();
player.OnGameOver += GameOver;
}

private void GameOver()
{
State = GameState.LOSE;
StartCoroutine(DelayAction(1.5f,()=> {
State = GameState.GAME_OVER;
ResetGame();
OnGameOver.Invoke(Score);

}));
}

public void ResetGame()
{
ClearObstacle();
ResetLevels();
player.Reset();
}

private void ClearObstacle()
{
foreach (Transform child in spawnRegion.transform)
{
Destroy(child.gameObject);
}
}

private IEnumerator DelayAction(float delay, System.Action action)
{
yield return new WaitForSeconds(delay);
action();
}

private void ResetLevels()
{
levels[0].AnchoredPosition = new Vector3(0, -levels[0].Size.y / 2);
for ( int i = 1; i < levels.Count; i ++)
{
levels[i].AnchoredPosition = new Vector3(0, levels[i — 1].AnchoredPosition.y + levels[ i- 1].Size.y);
}
}
private Level SpawnNewLevel1()
{
Level level = Instantiate(LevelPrefab, Vector3.zero, Quaternion.identity, levelRegion);
level.AnchoredPosition =Vector3.zero;
level.BackColor = colors[UnityEngine.Random.Range(0, colors.Count)];
level.Size = new Vector2 (levelRegion.parent.GetComponent<RectTransform>().sizeDelta.x, levelRegion.parent.GetComponent<RectTransform>().sizeDelta.y * 2 );
level.OnFinishLevel += MoveLevelTop;
level.OnStartNewLevel += () => { CurrentLevel++; };
return level;
}

private void MoveLevelTop (Level level)
{
level.Setup(new Vector3(0, lastLevel.AnchoredPosition.y + lastLevel.Size.y), colors[CurrentLevel % colors.Count], CurrentLevel);
lastLevel = level;
SpawnObstacle(ObstaclePrefabs[UnityEngine.Random.Range(0, ObstaclePrefabs.Count )], spawnRegion);
//level.AnchoredPosition = new Vector3(0, lastLevel.AnchoredPosition.y + lastLevel.Size.y);
}

public void StartGame()
{ CurrentLevel = 1;
Score = 0;
State = GameState.PLAY;
SpawnObstacle(ObstaclePrefabs[UnityEngine.Random.Range(0, ObstaclePrefabs.Count)], spawnRegion);
StartCoroutine(ScoreCoroutine());
}

private IEnumerator ScoreCoroutine()
{
while (State == GameState.PLAY)
{
Score++;
yield return new WaitForSeconds(0.2f);
}
}
private void SpawnObstacle(GameObject gameObject, Transform spawnRegion, bool isFirst= false)
{
Instantiate(gameObject, spawnRegion.transform.position * (isFirst ? 0.5f : 1), Quaternion.identity, spawnRegion);
}

}

Хочу чтобы префаб Level спавнился, когда проходим границы Level. Мы перемещаем новый уровень вверх, пересоздавая его. Но вот скрипт не работает , вылазит вот такая ошибка, когда прохожу границы Level

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Object reference not set to an instance of an object tarkov как исправить
  • Object reference not set to an instance of an object cities skylines ошибка
  • Object prototype may only be an object or null wink ошибка как исправить
  • Object processing error касперский
  • Object of type int has no len python ошибка

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии