Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку Invoke
/ BeginInvoke
принимает Delegate
(а не введенный делегат), необходимо сказать компилятору какой делегат создавать; MethodInvoker
(2.0) или Action
(3.5) общий выбор (обратите внимание, что у них есть та же подпись); как так:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
, Если необходимо передать в параметрах, затем, "полученные переменные" являются путем:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(протест: необходимо быть немного осторожными при использовании получений асинхронный , но синхронизация прекрасна - т.е. вышеупомянутое прекрасно)
, Другая опция состоит в том, чтобы записать дополнительный метод:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
затем:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
можно, конечно, сделать то же с [1 110]:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
, Если Вы не можете использовать C# 3.0, Вы могли бы сделать то же с регулярным методом экземпляра, по-видимому, в Form
базовый класс.
myControl.Invoke(new MethodInvoker(delegate() {...}))
Необходимо создать тип делегата. Ключевое слово 'делегат' в анонимном создании метода является немного вводящим в заблуждение. Вы не создаете анонимного делегата, но анонимный метод. Метод, который Вы создали, может использоваться в делегате. Как это:
myControl.Invoke(new MethodInvoker(delegate() { (MyMethod(this, new MyEventArgs(someParameter)); }));
На самом деле Вы не должны использовать ключевое слово делегата. Просто передайте лямбду как параметр:
control.Invoke((MethodInvoker)(() => {this.Text = "Hi"; }));
У меня были проблемы с другими предложениями, потому что я хочу иногда возвращать значения из своих методов. При попытке использовать MethodInvoker с возвращаемыми значениями, этому, кажется, не нравится он. Таким образом, решение, которое я использую, похоже на это (очень счастливый услышать способ сделать это более сжатым - я использую c#.net 2.0):
// Create delegates for the different return types needed.
private delegate void VoidDelegate();
private delegate Boolean ReturnBooleanDelegate();
private delegate Hashtable ReturnHashtableDelegate();
// Now use the delegates and the delegate() keyword to create
// an anonymous method as required
// Here a case where there's no value returned:
public void SetTitle(string title)
{
myWindow.Invoke(new VoidDelegate(delegate()
{
myWindow.Text = title;
}));
}
// Here's an example of a value being returned
public Hashtable CurrentlyLoadedDocs()
{
return (Hashtable)myWindow.Invoke(new ReturnHashtableDelegate(delegate()
{
return myWindow.CurrentlyLoadedDocs;
}));
}