2

我正在使用 Parse.com 进行推送通知。当我收到推送通知时,此类执行:

public class MyCustomReceiver extends BroadcastReceiver {

    protected ObjetoMensaje DatosObjecto;
    protected SerializacionDeDatos Sdd;
    protected String alert, fecha, name, tipo;
    private static final String TAG = "MyCustomReceiver";

  @Override
  public void onReceive(Context context, Intent intent) {
    try {

        DatosObjecto = new ObjetoMensaje();
        Sdd = new SerializacionDeDatos();

      String action = intent.getAction();
      String channel = intent.getExtras().getString("com.parse.Channel");
      JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));

      Log.d(TAG, "got action " + action + " on channel " + channel + " with:");
      Iterator<?> itr = json.keys();
      Log.i("","");

      while (itr.hasNext()) {
        String key = (String) itr.next();
        Log.d(TAG, "..." + key + " => " + json.getString(key));
        Log.d(TAG,"");
       }

      alert = json.getString("alert").toString();
      name = json.getString("name").toString();
      tipo = json.getString("tipo").toString();

      DatosObjecto.setAlert(alert);
      DatosObjecto.setName(name);
      DatosObjecto.setTipo(tipo);

      Sdd.Serializa(DatosObjecto); //this line, I use for call the class "SerializacionDeDatos"

    } catch (JSONException e) {
      Log.d(TAG, "JSONException: " + e.getMessage());
    }
  }
}

这些行:

 alert = json.getString("alert").toString();
  name = json.getString("name").toString();
  tipo = json.getString("tipo").toString();

  DatosObjecto.setAlert(alert);
  DatosObjecto.setName(name);
  DatosObjecto.setTipo(tipo);

当我收到推送时,我正在提取“alert”、“name”和“tipo”的值。我把它们放在一个 ObjetoMensaje 对象中。代码:

public class ObjetoMensaje extends Activity implements Serializable{ 

private static final long serialVersionUID = 5680898935329497057L; 
private String  alert, name, tipo; 
protected String filename = "datos.dat";

public ObjetoMensaje(){}; 

public ObjetoMensaje(String alert, String name, String tipo){ 
    super(); 
    this.alert = alert;
    this.name = name;
    this.tipo = tipo; 
    }

public String getAlert(){
    return alert;
}

public void setAlert(String alert){
    this.alert = alert;
    Log.i("Set Alert", "Excitoso");
}

public String getName(){
    return name;
}

public void setName(String name){
    this.name = name;
    Log.i("Set Name", "Excitoso");
}

public String getTipo(){
    return tipo;
}

public void setTipo(String tipo){
    this.tipo = tipo;
    Log.i("Set tipo", "Excitoso");
}
}

我想序列化值“alert”、“name”和“tipo”,所以我创建了一个序列化类:

public class SerializacionDeDatos extends Activity{

protected String filename = "datos.dat";
protected void Serializa(ObjetoMensaje DatosObjecto){
            FileOutputStream fos;
            try {
                fos = openFileOutput(filename, Context.MODE_PRIVATE);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(DatosObjecto);
                oos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
    }
}

当我打电话给班级时,我收到了这个错误:

08-08 13:15:32.976: W/dalvikvm(8360): threadid=1: thread exiting with uncaught exception (group=0x4001c578)
08-08 13:15:33.070: E/AndroidRuntime(8360): FATAL EXCEPTION: main
08-08 13:15:33.070: E/AndroidRuntime(8360): java.lang.RuntimeException: Unable to start receiver mx.nivel9.apps.MyCustomReceiver: java.lang.NullPointerException
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:1809)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.app.ActivityThread.access$2400(ActivityThread.java:117)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.os.Looper.loop(Looper.java:130)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.app.ActivityThread.main(ActivityThread.java:3687)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at java.lang.reflect.Method.invokeNative(Native Method)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at java.lang.reflect.Method.invoke(Method.java:507)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at dalvik.system.NativeStart.main(Native Method)
08-08 13:15:33.070: E/AndroidRuntime(8360): Caused by: java.lang.NullPointerException
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at mx.nivel9.apps.SerializacionDeDatos.Serializa(SerializacionDeDatos.java:23)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at mx.nivel9.apps.MyCustomReceiver.onReceive(MyCustomReceiver.java:50)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:1798)
08-08 13:15:33.070: E/AndroidRuntime(8360):     ... 10 more

我究竟做错了什么?

4

2 回答 2

1

该错误来自 SerializacionDeDatos 类中的代码行 23。您正在对尚未初始化的对象调用方法 - 这意味着您为对象创建了一个变量,但没有使用“new”运算符创建对象或初始化返回 null。

如果“文件名”无效,这一行可能是问题所在。

fos = openFileOutput(filename, Context.MODE_PRIVATE);

幸运的是,您的代码片段中没有行号,因此我无法确定错误的确切来源。

于 2013-08-08T18:59:03.067 回答
0

异常日志中的这些行:

08-08 13:15:33.070: E/AndroidRuntime(8360):     at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158)
08-08 13:15:33.070: E/AndroidRuntime(8360):     at mx.nivel9.apps.SerializacionDeDatos.Serializa(SerializacionDeDatos.java:23)

告诉我们异常被抛出

 fos = openFileOutput(filename, Context.MODE_PRIVATE);

SerializacionDeDatos课堂上,或者更明显的是对 的调用openFileOutput,这意味着您所引用的文件可能存在根本问题(权限、存在等)

除非您针对每种类型的异常执行特定的操作,否则您应该在您的方法中添加一个通用的for catch,并打印堆栈跟踪以找出问题所在,如下所示:(Exception e)trySerializa

        try {

            fos = openFileOutput(filename, Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(DatosObjecto);
            oos.close();

        } catch (Exception e) {

            e.printStackTrace();
        } 

进一步注意,你没有关闭你的FileOutputStream. 最佳做法是在trywith null 之外对其进行初始化,然后close()在您的块中调用该方法finally,如下所示:

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {

            fos = openFileOutput(filename, Context.MODE_PRIVATE);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(DatosObjecto);

        } catch (Exception e) {

            e.printStackTrace(); // NOW this should now tell us what's going wrong.

        } finally {

            try {

                oos.close();

            } catch (Exception e) {

                e.printStackTrace();
            }

            try {

                fos.close();

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

更新:您在下面的评论中指出您正在收到一个NullPointerException. 这是调用时很常见的问题Activity.openFileOutput()

检查您的答案是否在以下任何链接上:

于 2013-08-08T19:06:17.663 回答