Вытягивание данных Var из A & ldquo; If & rdquo; [Дубликат]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

36
задан Péter Török 15 March 2010 в 17:50
поделиться

11 ответов

Вы не инициализировали a и b, только объявили их. Существует тонкая разница.

int a = 0;
int b = 0;

По крайней мере, это для C ++, я полагаю, что Java - это одна и та же концепция.

1
ответ дан Andy Shellam 31 August 2018 в 22:58
поделиться

Вы объявили их, но не предоставили им начальное значение - таким образом, они неинициализированы. Попробуйте что-то вроде:

public static Rand searchCount (int[] x)  
{ 
  int a = 0 ;  
  int b = 0 ; 

, и предупреждения должны исчезнуть.

1
ответ дан Bob Jarvis 31 August 2018 в 22:58
поделиться

Представьте, что произойдет, если x [l] не является ни 0, ни 1 в цикле. В этом случае a и b никогда не будут назначены и имеют неопределенное значение. Вы должны инициализировать их как с некоторым значением, например 0.

1
ответ дан codymanix 31 August 2018 в 22:58
поделиться
int a = 0;
int b = 0;
0
ответ дан Dark Castle 31 August 2018 в 22:58
поделиться

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

  public static void main(String[] args){
    int a;
    int[] arr = {1,2,3,4,5};
    for(int i=0; i<arr.length; i++){
        a = arr[i];
    }
    System.out.println(a);
  }

Вы можете ожидать, что консоль покажет «5», но вместо этого компилятор выкинет ошибку «переменная a не может быть инициализирована». Хотя можно подумать, что переменная a «инициализирована» внутри цикла for, компилятор не думает так. Что делать, если arr.length равно 0? Цикл for не будет запущен вообще. Следовательно, компилятор даст variable a might not have been initialized указать потенциальную опасность и потребует инициализации переменной.

Чтобы предотвратить такую ​​ошибку, просто инициализируйте переменную, когда вы ее объявите.

int a = 0;
0
ответ дан jackycflau 31 August 2018 в 22:58
поделиться

Вы объявили их, но не инициализировали их со значением. Добавьте что-то вроде этого:

int a = 0;
2
ответ дан Jerome 31 August 2018 в 22:58
поделиться

Вы объявили их, но не инициализированы.

int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization
3
ответ дан Konrad Garus 31 August 2018 в 22:58
поделиться

Локальные переменные не получают значения по умолчанию. Их начальные значения не определены, не назначая значения каким-либо образом. Прежде чем вы сможете использовать локальные переменные, они должны быть инициализированы.

Существует большая разница, когда вы объявляете переменную на уровне класса (как член, то есть как поле) и на уровне метода.

Если вы объявляете поле на уровне класса, они получают значения по умолчанию в соответствии с их типом. Если вы объявляете переменную на уровне метода или в виде блока (означает, что anycode внутри {}) не получает никаких значений и остается неопределенным, пока каким-то образом они не получат некоторые начальные значения, то есть некоторые значения, назначенные им.

63
ответ дан Pshemo 31 August 2018 в 22:58
поделиться
  • 1
    Возможно, "int b = 0; & quot; является «декларацией и инициализацией». – Arun 15 March 2010 в 18:05
  • 2
    Для будущих посетителей ... Также см. Значения по умолчанию и инициализация в Java , когда потенциально неинициализированная переменная является членом класса. – jww 6 December 2016 в 19:05
  • 3
    Может ли кто-нибудь объяснить, как это возможно, потому что примитивы не могут иметь нулевые значения, их значение по умолчанию равно 0, почему оно показывает не инициализированную ошибку? – Srujan Barai 21 October 2017 в 00:33
  • 4
    @SrujanBarai. Их значение по умолчанию равно нулю , если объявлено как члены класса . Локальные переменные не имеют значений по умолчанию. – user207421 28 January 2018 в 04:22

Установите переменную «a» на некоторое значение, подобное этому,

a=0;

Объявление и инициализация оба разные.

Удача

1
ответ дан Rishabh Agarwal 31 August 2018 в 22:58
поделиться
  • 1
    На самом деле, нет. Инициализация является необязательной частью синтаксиса объявления. – user207421 28 January 2018 в 04:20

Если они были объявлены как поля класса, тогда они были бы действительно инициализированы 0.

Вы немного сбиты с толку, потому что если вы пишете:

class Clazz {
  int a;
  int b;

  Clazz () {
     super ();
     b = 0;
  }

  public void printA () {
     sout (a + b);
  }

  public static void main (String[] args) {
     new Clazz ().printA ();
  }
}

Тогда этот код напечатает «0». Это связано с тем, что при создании нового экземпляра Clazz будет вызываться специальный конструктор. Сначала будет вызываться super (), тогда поле a будет инициализировано неявно, а затем будет выполнена строка b = 0.

6
ответ дан Roman 31 August 2018 в 22:58
поделиться

Вы объявили их в начале метода, но вы никогда не инициализировали их. Инициализация будет устанавливать их равными значению, например:

int a = 0;
int b = 0;
1
ответ дан Thomas Owens 31 August 2018 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: