Android 由于数据连接不良,适配器中出现异常

Android 由于数据连接不良,适配器中出现异常,android,nullpointerexception,android-adapter,Android,Nullpointerexception,Android Adapter,只要有人打电话从MySQL数据库中获取数据,我的应用程序中就会出现一些类似下面的StackTrace。如果连接断开并且超时,我会得到以下跟踪: 例如: java.lang.NullPointerException at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128) at com.---.---.pr

只要有人打电话从MySQL数据库中获取数据,我的应用程序中就会出现一些类似下面的StackTrace。如果连接断开并且超时,我会得到以下跟踪:

例如:

java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
at com.---.---.profile.MyReviewAdapter.<init>(MyReviewAdapter.java:20)
at com.---.---.profile.UserFragmentActivity$CommentFragment$MyCommentTask.onPostExecute(UserFragmentActivity.java:559)
at com.---.---.profile.UserFragmentActivity$CommentFragment$MyCommentTask.onPostExecute(UserFragmentActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
at com.---.---.master.TopItemAdapter.<init>(TopItemAdapter.java:18)
at com.---.---.master.MainFragmentActivity$TopFrag$TopTask.onPostExecute(MainFragmentActivity.java:961)
at com.---.---.master.MainFragmentActivity$TopFrag$TopTask.onPostExecute(MainFragmentActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
  • 什么是空指针异常?您能读取吗
  • 我认为,首先,应该正确初始化对象,而不是使用null。例如:

    InputStream is = null;
    
  • 这样做:

    InputStream is = new InputStream();
    
    try {
                    JSONArray jArray = new JSONArray(result);
                    JSONObject json_data = null;
                    for (int i = 0; i < jArray.length(); i++) {
                        json_data = new JSONOBject(jArray.getJSONObject(i).toString());
                        item = json_data.getString("item");
                        cat = json_data.getString("category");
    
                        items.add(item);
                        cats.add(cat);
    
                    }
                } catch (JSONException e1) {
    
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }
    
    不止一个对象初始化为null

    编辑:

    我认为问题在于:

    try {
                    JSONArray jArray = new JSONArray(result);
                    JSONObject json_data = null;
                    for (int i = 0; i < jArray.length(); i++) {
                        json_data = jArray.getJSONObject(i);
                        item = json_data.getString("item");
                        cat = json_data.getString("category");
    
                        items.add(item);
                        cats.add(cat);
    
                    }
                } catch (JSONException e1) {
    
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }
    
    试试看{
    JSONArray jArray=新JSONArray(结果);
    JSONObject json_data=null;
    for(int i=0;i
    这样做:

    InputStream is = new InputStream();
    
    try {
                    JSONArray jArray = new JSONArray(result);
                    JSONObject json_data = null;
                    for (int i = 0; i < jArray.length(); i++) {
                        json_data = new JSONOBject(jArray.getJSONObject(i).toString());
                        item = json_data.getString("item");
                        cat = json_data.getString("category");
    
                        items.add(item);
                        cats.add(cat);
    
                    }
                } catch (JSONException e1) {
    
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }
    
    试试看{
    JSONArray jArray=新JSONArray(结果);
    JSONObject json_data=null;
    for(int i=0;i
    并捕获所有异常,不仅仅是JSONException和ParseException

  • 什么是空指针异常?您能读取吗
  • 我认为,首先,应该正确初始化对象,而不是使用null。例如:

    InputStream is = null;
    
  • 这样做:

    InputStream is = new InputStream();
    
    try {
                    JSONArray jArray = new JSONArray(result);
                    JSONObject json_data = null;
                    for (int i = 0; i < jArray.length(); i++) {
                        json_data = new JSONOBject(jArray.getJSONObject(i).toString());
                        item = json_data.getString("item");
                        cat = json_data.getString("category");
    
                        items.add(item);
                        cats.add(cat);
    
                    }
                } catch (JSONException e1) {
    
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }
    
    不止一个对象初始化为null

    编辑:

    我认为问题在于:

    try {
                    JSONArray jArray = new JSONArray(result);
                    JSONObject json_data = null;
                    for (int i = 0; i < jArray.length(); i++) {
                        json_data = jArray.getJSONObject(i);
                        item = json_data.getString("item");
                        cat = json_data.getString("category");
    
                        items.add(item);
                        cats.add(cat);
    
                    }
                } catch (JSONException e1) {
    
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }
    
    试试看{
    JSONArray jArray=新JSONArray(结果);
    JSONObject json_data=null;
    for(int i=0;i
    这样做:

    InputStream is = new InputStream();
    
    try {
                    JSONArray jArray = new JSONArray(result);
                    JSONObject json_data = null;
                    for (int i = 0; i < jArray.length(); i++) {
                        json_data = new JSONOBject(jArray.getJSONObject(i).toString());
                        item = json_data.getString("item");
                        cat = json_data.getString("category");
    
                        items.add(item);
                        cats.add(cat);
    
                    }
                } catch (JSONException e1) {
    
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }
    
    试试看{
    JSONArray jArray=新JSONArray(结果);
    JSONObject json_data=null;
    for(int i=0;i

    并捕获所有异常,不仅仅是JSONException和ParseException。

    如果您主要关心的是强制关闭,并且您希望您的应用程序从不显示强制关闭,那么您可以使用UncaughtExceptionHandler

    public class UncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler
    {
        private final Context myContext;
    
    public UncaughtExceptionHandler(Context context) {
        myContext = context;
    }
    
    public void uncaughtException(Thread thread, Throwable exception) {
    
    
        StringWriter stackTrace = new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));
        System.err.println(stackTrace);
    
        Intent intent = new Intent(myContext, AnyActivity.class);
        myContext.startActivity(intent);
    
        Process.killProcess(Process.myPid());
        System.exit(10);
    }
    }
    
    活动中的设置内容视图之前写下这一行

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler  (this));
    

    如果您主要关心的是强制关闭,并且您希望您的应用程序从不显示强制关闭,那么您可以使用UncaughtExceptionHandler

    public class UncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler
    {
        private final Context myContext;
    
    public UncaughtExceptionHandler(Context context) {
        myContext = context;
    }
    
    public void uncaughtException(Thread thread, Throwable exception) {
    
    
        StringWriter stackTrace = new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));
        System.err.println(stackTrace);
    
        Intent intent = new Intent(myContext, AnyActivity.class);
        myContext.startActivity(intent);
    
        Process.killProcess(Process.myPid());
        System.exit(10);
    }
    }
    
    活动中的设置内容视图之前写下这一行

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler  (this));
    
    这个例外意味着什么

    正如我在评论中所说的那样,
    NullPointerException
    之所以没有出现,是因为数据库连接失败(在这种情况下,会发生另一个错误,而且会更快),它之所以出现,是因为您没有考虑安卓使用活动和片段的方式(更准确地说是它们的生命周期)

    我不知道您是否有关于这些异常的额外详细信息,我猜当用户转到有问题的
    片段
    看到
    进度对话框
    (任务启动)然后旋转手机时,会出现异常。此时,Android将重新创建该活动以及包含该活动的任何片段。这应该由您的代码来处理,但是您做了一些特别糟糕的事情,这将抛出
    NullPointerException

    看看您声明
    TopTask
    类的方式,可以安全地说它是
    片段中的一个内部类。作为一个内部类意味着它与封闭的
    片段
    实例有一个“连接”,允许它使用片段的方法(如
    getActivity()
    )。因此,用户转到
    片段
    ,任务启动,然后旋转手机。此时将重新创建活动和片段,但您的任务(仍在运行)将保留对初始片段的特殊引用(该片段现在已死亡)。旋转后,此初始片段引用将与活动分离,其
    getActivity
    方法将返回
    null
    。将
    null
    传递给
    ArrayAdapter
    (在您的情况下,通过a
    super
    调用)将抛出您看到的异常(来自带有
    ICS
    的设备)。传递给适配器的数组不能为
    null
    ,因为您在适配器初始化的正上方声明了它。这也会引发不同的异常

    更重要的是,我如何防止这种情况?即使