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 неправильно интерпретировала амперсанды и скобки .
Вы не инициализировали a
и b
, только объявили их. Существует тонкая разница.
int a = 0;
int b = 0;
По крайней мере, это для C ++, я полагаю, что Java - это одна и та же концепция.
Вы объявили их, но не предоставили им начальное значение - таким образом, они неинициализированы. Попробуйте что-то вроде:
public static Rand searchCount (int[] x)
{
int a = 0 ;
int b = 0 ;
, и предупреждения должны исчезнуть.
Представьте, что произойдет, если x [l] не является ни 0, ни 1 в цикле. В этом случае a и b никогда не будут назначены и имеют неопределенное значение. Вы должны инициализировать их как с некоторым значением, например 0.
Хорошая практика для инициализации локальных переменных внутри блока методов перед использованием. Вот ошибка, которую может совершить новичок.
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;
Вы объявили их, но не инициализировали их со значением. Добавьте что-то вроде этого:
int a = 0;
Вы объявили их, но не инициализированы.
int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization
Локальные переменные не получают значения по умолчанию. Их начальные значения не определены, не назначая значения каким-либо образом. Прежде чем вы сможете использовать локальные переменные, они должны быть инициализированы.
Существует большая разница, когда вы объявляете переменную на уровне класса (как член, то есть как поле) и на уровне метода.
Если вы объявляете поле на уровне класса, они получают значения по умолчанию в соответствии с их типом. Если вы объявляете переменную на уровне метода или в виде блока (означает, что anycode внутри {}) не получает никаких значений и остается неопределенным, пока каким-то образом они не получат некоторые начальные значения, то есть некоторые значения, назначенные им.
Установите переменную «a» на некоторое значение, подобное этому,
a=0;
Объявление и инициализация оба разные.
Удача
Если они были объявлены как поля класса, тогда они были бы действительно инициализированы 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
.
Вы объявили их в начале метода, но вы никогда не инициализировали их. Инициализация будет устанавливать их равными значению, например:
int a = 0;
int b = 0;