0

java.lang の newInstace() メソッドを使用して、(リフレクションを使用して読み込まれた) クラスの 1 つをオブジェクトに格納しようとしています。newInstace() を作成するメソッド内で動作するようですが、その外側では、var が null ポインター例外をスローします...本当に意味がありません。これを修正する方法を知っている人はいますか?

クラス:

public class ScriptManager {

public static Class currentScript;
public static Object ScriptInstance;
public static int State;
// 0 = Not Running
// 1 = Running
// 2 = Paused

public static void runScript() {
    try {
        ScriptInstance = currentScript.newInstance();
        currentScript.getMethod("run").invoke(ScriptInstance);
        State = 1;
        MainFrame.onPause();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void pauseScript() {
    try {
        currentScript.getMethod("pause").invoke(ScriptInstance);
        State = 2;
        MainFrame.onPause();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void stopScript() {
    try {
        currentScript.getMethod("stop").invoke(ScriptInstance);
        State = 0;
        MainFrame.onStop();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

エラー:

java.lang.NullPointerException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at Bot.ScriptManager.pauseScript(ScriptManager.java:29)
4

1 に答える 1

0

の使用はあなたをstatic台無しにしています。次のようなことを試してください:

   public class ScriptManager {

      private Class currentScript;
      private Object scriptInstance;
      private int state;

      public ScriptManager() {
        try {
            scriptInstance = currentScript.newInstance();
            currentScript.getMethod("run").invoke(scriptInstance);
            //the rest
        } catch (Exception e) {
            e.printStackTrace();
        }
      }

      public void pauseScript() {
        try {
            currentScript.getMethod("pause").invoke(scriptInstance);
            //the rest
        } catch (Exception e) {
            e.printStackTrace();
        }
      }
//the rest
}

ちなみに、変数名には小文字のキャメルケースを使用してください。

privateそして、このシナリオではメンバー変数を保持してください。

于 2013-11-09T19:03:44.357 に答える