0

私の Android アプリには非常に異常な NullPointerException があります。問題を引き起こしているのは次のコードです。

private void setPreferences() {

        SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        ReceptionBuffer = new byte[64];     // Buffer de recepcion general de 64 bytes

        // Protocolo para cada canal (I2C, UART, SPI)
        byte[] temp = new byte[4];
        // Canal para el clock de cada canal (en caso de usar protocolos con clock como I2C,SPI)
        byte[] temp2 = new byte[4];

        for(int n=0; n < 4; ++n){
            temp[n] = Byte.decode(getPrefs.getString("protocol" + n, "0"));
            temp2[n] = Byte.decode(getPrefs.getString("channel" + n + "SCL", "0"));
        }
        for(int n=0; n < 4; ++n){
            if(DEBUG) Log.i(TAG, "LogicAnalizerView -> setPreferences() - n: " + n);
            switch(temp[n]){
            case 0:
                channelProperties[n].setProtocol(Protocol.I2C);
                break;
            case 1:
                channelProperties[n].setProtocol(Protocol.UART);
                break;
            }
            channelProperties[n].setClockSource(temp2[n]);
        }

    }

そして、それは LogCat です。

05-16 22:28:11.019: I/(965): LogicAnalizerView -> setPreferences() - n: 0
05-16 22:28:11.049: D/AndroidRuntime(965): Shutting down VM
05-16 22:28:11.049: W/dalvikvm(965): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
05-16 22:28:11.099: I/dalvikvm(965): threadid=3: reacting to signal 3
05-16 22:28:11.332: I/dalvikvm(965): Wrote stack traces to '/data/anr/traces.txt'
05-16 22:28:11.429: E/AndroidRuntime(965): FATAL EXCEPTION: main
05-16 22:28:11.429: E/AndroidRuntime(965): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.multiwork.andres/com.multiwork.andres.LogicAnalizerView}: java.lang.NullPointerException
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.os.Looper.loop(Looper.java:137)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.ActivityThread.main(ActivityThread.java:4424)
05-16 22:28:11.429: E/AndroidRuntime(965):  at java.lang.reflect.Method.invokeNative(Native Method)
05-16 22:28:11.429: E/AndroidRuntime(965):  at java.lang.reflect.Method.invoke(Method.java:511)
05-16 22:28:11.429: E/AndroidRuntime(965):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-16 22:28:11.429: E/AndroidRuntime(965):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-16 22:28:11.429: E/AndroidRuntime(965):  at dalvik.system.NativeStart.main(Native Method)
05-16 22:28:11.429: E/AndroidRuntime(965): Caused by: java.lang.NullPointerException
05-16 22:28:11.429: E/AndroidRuntime(965):  at com.multiwork.andres.LogicAnalizerView.setPreferences(LogicAnalizerView.java:361)
05-16 22:28:11.429: E/AndroidRuntime(965):  at com.multiwork.andres.LogicAnalizerView.onCreate(LogicAnalizerView.java:93)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.Activity.performCreate(Activity.java:4465)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-16 22:28:11.429: E/AndroidRuntime(965):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-16 22:28:11.429: E/AndroidRuntime(965):  ... 11 more
05-16 22:28:11.709: I/dalvikvm(965): threadid=3: reacting to signal 3
05-16 22:28:11.931: I/dalvikvm(965): Wrote stack traces to '/data/anr/traces.txt'
05-16 22:28:12.389: I/dalvikvm(965): threadid=3: reacting to signal 3
05-16 22:28:12.459: I/dalvikvm(965): Wrote stack traces to '/data/anr/traces.txt'
05-16 22:28:13.039: I/dalvikvm(965): threadid=3: reacting to signal 3
05-16 22:28:13.230: I/dalvikvm(965): Wrote stack traces to '/data/anr/traces.txt'
05-16 22:28:17.912: I/Process(965): Sending signal. PID: 965 SIG: 9

LogCat によると、問題は channelProperties[n].setProtocol(Protocol.I2C); の行にあります。setPreferences() は onCreate() メソッドから呼び出されており、これの前にグローバル変数として持っています:

private static LogicChannelProperties[] channelProperties = new LogicChannelProperties[4];

スペースを割り当てたので、奇妙です。なぜ私はこれを取得していますか? それは私のクラスです:

import com.multiwork.andres.LogicData.Protocol;

public class LogicChannelProperties {

    private Protocol mProtocol;
    private int clockSource;

    /**
     * Setea el protocolo a usar (ej: Protocol.I2C/SPI...)
     * @author Andres Torti
     * @param type es el protocolo a usar (ej: Protocol.I2C/SPI...)
     */
    public void setProtocol (Protocol type){
        mProtocol = type;
    }

    /**
     * Obtiene el protocolo
     * @author Andres Torti
     * @return variable tipo Protocol (ej: Protocol.I2C/SPI...)
     */
    public Protocol getProtocol (){
        return mProtocol;
    }

    /**
     * Setea el canal que actua como fuente de clock
     * @author Andres Torti
     * @param sourceChannel es el numero del canal >0
     */
    public void setClockSource (int sourceChannel){
        clockSource = sourceChannel;
    }

    /**
     * Obtiene el canal que actua como fuente de clock
     * @author Andres Torti
     * @return int, numero del canal
     */
    public int getClockSource (){
        return clockSource;
    }

}

お時間をいただきありがとうございます:)

4

2 に答える 2

1

その例外は、作成時に例外がスローされたため、アクティビティを開始できないことを意味します。実際の問題は、NullPointerExceptionの 361 行目で発生していLogicAnalizerView.javaます。

channelProperties[]配列を作成しているように見えますが、何も入力していないように見えるため、適切に初期化されていないのは配列だと思います。

channelProperties[0] = new ChannelProperties();したがって、 //etcのようなものが必要です。

幸運を!

于 2012-05-16T22:43:47.033 に答える
1

「static LogicChannelProperties[] channelProperties = new LogicChannelProperties[4]」という行は、4 つのオブジェクトの配列を割り当てますが、オブジェクト自体は作成しません。そのステートメントにはコンストラクター呼び出しがなく、配列の割り当てだけであることに注意してください。

配列を繰り返し処理して、個々のオブジェクト インスタンスを作成する必要があります。

channelProperties[0] = new LogicChannelProperties();
于 2012-05-16T22:53:32.960 に答える