Анонимный метод в Вызывает вызов

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

Например, ниже - класс ученика, который будет использовать его в нашем коде.

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 ");
        }
    }
}
124
задан Patrick Hofman 4 June 2014 в 10:45
поделиться

5 ответов

Поскольку 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 базовый класс.

214
ответ дан 24 November 2019 в 01:05
поделиться
myControl.Invoke(new MethodInvoker(delegate() {...}))
14
ответ дан 24 November 2019 в 01:05
поделиться

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

myControl.Invoke(new MethodInvoker(delegate() { (MyMethod(this, new MyEventArgs(someParameter)); }));
13
ответ дан 24 November 2019 в 01:05
поделиться

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

control.Invoke((MethodInvoker)(() => {this.Text = "Hi"; }));
43
ответ дан 24 November 2019 в 01:05
поделиться

У меня были проблемы с другими предложениями, потому что я хочу иногда возвращать значения из своих методов. При попытке использовать 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;
        }));
    }
5
ответ дан 24 November 2019 в 01:05
поделиться
Другие вопросы по тегам:

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