-1

在尝试连接到 Web 服务(在线托管的 XML 文件)时,我遇到了通知显示为空值的问题。结果是 NullPointerException 我只需要一些帮助来查明问题的根源。我熟悉调试器以及如何记录和设置断点——我只需要一只手弄清楚我应该在哪里设置它们,而不是我已经拥有它们的地方(我仍然找不到问题的根源)。

附言

我已经包含了一些注释掉的代码(我很抱歉——我本可以把它拿出来缩短一点——但我想我可能会包括它,因为也许这就是问题所在)。

提前致谢!

日志猫:

08-16 10:21:19.531: I/System.out(1293): Sim State5
08-16 10:21:19.591: D/Network Availability(1293): CONNECTED
08-16 10:21:19.591: D/Network Availability(1293): NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true
08-16 10:21:19.751: I/Adreno200-EGLSUB(1293): <ConfigWindowMatch:2078>: Format RGBA_8888.
08-16 10:21:39.861: D/MDN(1293): 310410
08-16 10:21:39.861: D/mdn1(1293): 676
08-16 10:21:39.861: D/mdn2(1293): 251
08-16 10:21:39.861: D/ICCID(1293): 89014103234448884342
08-16 10:21:39.861: I/System.out(1293): ICCID%1234 = 1120
08-16 10:21:39.861: I/System.out(1293): ICCID/1234 = 72134605538451283
08-16 10:21:39.901: I/Adreno200-EGLSUB(1293): <ConfigWindowMatch:2078>: Format RGBA_8888.
08-16 10:21:45.201: V/In the parser(1293): now
08-16 10:21:45.221: V/value(1293): default,mms,supl
08-16 10:21:45.221: I/System.out(1293): size 1
08-16 10:21:45.231: I/System.out(1293): net10
08-16 10:21:45.231: I/System.out(1293): tfdata
08-16 10:21:45.371: I/Adreno200-EGLSUB(1293): <ConfigWindowMatch:2078>: Format RGBA_8888.
08-16 10:21:53.481: I/System.out(1293): count...1
08-16 10:21:53.481: I/System.out(1293): the values in notificationActivity :port=80 mmsproxy=mms3.tracfone.com numeric=310410 mcc=310 proxy=mms3.tracfone.com name=net10 mnc=410 apn=tfdata mmsc=http://mms-tf.net mmsport=80at is   0
08-16 10:21:53.481: W/NotificationActivity(1293): Extras null
08-16 10:21:54.231: D/FIELD(1293): Name
08-16 10:21:54.231: W/dalvikvm(1293): threadid=1: thread exiting with uncaught exception (group=0x40ab31f8)
08-16 10:21:54.231: E/AndroidRuntime(1293): FATAL EXCEPTION: main
08-16 10:21:54.231: E/AndroidRuntime(1293): java.lang.NullPointerException
08-16 10:21:54.231: E/AndroidRuntime(1293):     at com.project.new.datasettings.ConfigFinalActivity.showNotification(ConfigFinalActivity.java:431)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at com.project.new.datasettings.ConfigFinalActivity.onClick(ConfigFinalActivity.java:208)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at android.view.View.performClick(View.java:3511)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at android.view.View$PerformClick.run(View.java:14111)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at android.os.Handler.handleCallback(Handler.java:605)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at android.os.Looper.loop(Looper.java:137)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at android.app.ActivityThread.main(ActivityThread.java:4429)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at java.lang.reflect.Method.invokeNative(Native Method)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at java.lang.reflect.Method.invoke(Method.java:511)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
08-16 10:21:54.231: E/AndroidRuntime(1293):     at dalvik.system.NativeStart.main(Native Method)

Nullpointer 出现在以下行:

String value = Values.get("name").toString();

资源:

public class ConfigFinalActivity extends Activity implements OnClickListener {
    private static final String TAG = "ConfigActivity";
    TelephonyManager tm;
    AlertDialog mErrorAlert = null;
    private Notification mNotification = null;
    private Button mXButton = null;
    private Button mAssistUpdateButton = null;
    private Button mAssistInstrButton = null;
    private Button mReadAgainButton = null;
    private int mInstructionNumber = 0;
    public static ArrayList<String> NameArr = new ArrayList<String>();
    public static ArrayList<String> ValueArr = new ArrayList<String>();
    public static ArrayList<String> nameArr = new ArrayList<String>();
    public static ArrayList<String> ApnArr = new ArrayList<String>();
    public static ArrayList<String> mmscArr = new ArrayList<String>();
    public static ArrayList<String> mmsportArr = new ArrayList<String>();
    public static ArrayList<String> mmsproxyArr = new ArrayList<String>();
    public static ArrayList<String> portArr = new ArrayList<String>();
    public static ArrayList<String> proxyArr = new ArrayList<String>();
    public static int count;
    public static int TotalSteps = 8;
    int i, g = 0, result = 0;
    String Result = "";
    public static ContentValues Values = new ContentValues();
    XmlParserHandlerFinal handler;

    public static final Uri APN_TABLE_URI = Uri
            .parse("content://telephony/carriers");
    public static String Base_URL = "https://www.mysettings.com/";
    public static InputStream stream = null;
    UpdateActivity update;
    public static String status;

    /** Called when the activity is first created. */
    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int version = android.os.Build.VERSION.SDK_INT;
        tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        update = new UpdateActivity();
        nameArr = update.getnameArr();
        ApnArr = update.getApnArr();
        mmscArr = update.getMMSCArr();
        mmsproxyArr = update.getMmscProxyArr();
        mmsportArr = update.getMmsPortArr();
        proxyArr = update.getMmscProxyArr();
        portArr = update.getMmsPortArr();
        count = update.getCount();



        if (ApnArr.isEmpty() || mmscArr.isEmpty() || mmsportArr.isEmpty()
                || mmsproxyArr.isEmpty() || proxyArr.isEmpty()
                || portArr.isEmpty()) {
            tryagain();
        } else if (version < VERSION_CODES.ICE_CREAM_SANDWICH) {

            // Update APN table
            try {
                result = updateTable();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }// Settings updated with this atomic call
            catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            if (result != -1) {
                status = "success";

            } else {
                status = "failure";
            }

            if (status.equals("success")) {
                completeUpdate();
            } else if (status.equals("failure")) {
                tryagain();
                // showAlert(getString(R.string.unchanged_net10_dialog));
            }

        } else {// ICS and later versions

            // Reduce number of steps to 6
            TotalSteps = 6;
            setContentView(R.layout.assist_update);
    //      String assistUpdate = getString(R.string.instructions_1);
    //      CharSequence styledText = Html.fromHtml(assistUpdate);
           // TextView assistText = (TextView) findViewById(R.id.apn_app_text_cta2);
    //      assistText.setText(styledText);
            mAssistUpdateButton = (Button) findViewById(R.id.assist_update_btn);
            mAssistUpdateButton.setOnClickListener(this);

        }
    }

    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.assist_update_btn:

            // Update button for ICS and up is selected
            // Get the TextView in the Assist Update UI

            TextView tv = (TextView) findViewById(R.id.apn_app_text_cta2);
            String text = "";
            CharSequence styledText = text;
            switch (mInstructionNumber) {

            case 0:
                // Retrieve the instruction string resource corresponding the
                // 2nd set of instructions
                text = String.format(getString(R.string.apn_app_text_instr),
                        TotalSteps);
                styledText = Html.fromHtml(text);
                // Update the TextView with the correct set of instructions
                tv.setText(styledText);
                // Increment instruction number so the correct instructions
                // string resource can be retrieve the next time the update
                // button is pressed
                mInstructionNumber++;
                break;
            case 1:
                text = getString(R.string.apn_app_text_instr2);
                styledText = Html.fromHtml(text);
                tv.setText(styledText);
                // Increment instruction number so the correct instructions
                // string resource can be retrieve the next time the update
                // button is pressed
                mInstructionNumber++;
                break;

            case 2:
                // Final set of instructions-Change to the corresponding layout

                setContentView(R.layout.assist_instructions);
                String assistUpdateInstr = String.format(
                        getString(R.string.apn_app_text_instr3), TotalSteps);
                //styledText = Html.fromHtml(assistUpdateInstr);
                TextView assistInstrText = (TextView) findViewById(R.id.updated_text);
                //assistInstrText.setText(styledText);
                mAssistInstrButton = (Button) findViewById(R.id.assist_instr_btn);
                //mReadAgainButton = (Button) findViewById(R.id.read_again_btn);
                mAssistInstrButton.setOnClickListener(this);
                // mReadAgainButton.setOnClickListener(this);

                // "LET'S DO THIS" Button in final instructions screen for ICS
                // and
                // up is selected
                // Create ConfigActivity Intent
                 Intent i = new Intent(this,
                 NotificationActivityForMultiProf.class);
                // Invoke ConfigActivity Intent to start the assisted update
                 startActivity(i);
            //   finish();

                // startActivity(new Intent(Settings.ACTION_APN_SETTINGS));
            }
        }  if (v == mAssistInstrButton) {

            // mAssistUpdateButton = (Button)
            // findViewById(R.id.assist_update_btn);
            // mAssistUpdateButton.setOnClickListener(this);
            startActivity(new Intent(Settings.ACTION_APN_SETTINGS));

            try {
                showNotification();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finish();// } else if (v == mReadAgainButton) {




            // go back to set of instructions if read again is selected
        //  mInstructionNumber = 2;

    //      setContentView(R.layout.screen5);
////            String one_text = String
////                    .format(getString(R.string.one), TotalSteps);
////            CharSequence styledText_one = Html.fromHtml(one_text);
//          TextView one = (TextView) findViewById(R.id.text_one);
//          one.setTextSize(18);
//          one.setText(styledText_one);
//          String two_text = String
//                  .format(getString(R.string.two), TotalSteps);
//          CharSequence styledText_two = Html.fromHtml(two_text);
//          TextView two = (TextView) findViewById(R.id.text_two);
//          two.setTextSize(18);
//          two.setText(styledText_two);
//          String three_text = String.format(getString(R.string.three),
//                  TotalSteps);
//          CharSequence styledText_three = Html.fromHtml(three_text);
//          TextView three = (TextView) findViewById(R.id.text_three);
//          three.setTextSize(18);
//          three.setText(styledText_three);
    //      mAssistUpdateButton = (Button) findViewById(R.id.assist_instr_btn);
        //  mAssistUpdateButton.setOnClickListener(this);

        }
    }



    /*
     * Insert a new APN entry into the system APN table Require an apn name, and
     * the apn address. More can be added. Return an id (_id) that is
     * automatically generated for the new apn entry.
     */
    public int InsertAPN() throws SecurityException {

        int id = -1;
        for (i = 0; i < count; i++) {
            ContentValues values2 = new ContentValues();
            // values2 = values1;
            values2 = getValues();
            ContentResolver resolver = getContentResolver();
            Cursor c = null;
            try {
                Uri newRow = resolver.insert(APN_TABLE_URI, values2);
                // System.out.println("values in insertAPN" + values1);
                if (newRow != null) {
                    c = resolver.query(newRow, null, null, null, null);
                    Log.d(TAG, "Newly added APN:");
                    // TF Settings have been inserted
                    // Obtain the apn id
                    int idindex = c.getColumnIndex("_id");
                    c.moveToFirst();
                    id = c.getShort(idindex);

                    Log.d(TAG, "New ID: " + id
                            + ": Inserting new APN succeeded!");
                }
            } catch (SQLException e) {
                Log.d(TAG, e.getMessage());
            }
            if (c != null)
                c.close();
        }
        return id;

    }

    public ContentValues getValues() {
        ContentValues values = new ContentValues();

        Log.d("name", (nameArr.get(i)));
        Log.d("apn", (ApnArr.get(i)));
        Log.d("mmsc", (mmscArr.get(i)));
        Log.d("mmsproxy", (mmsproxyArr.get(i)));
        Log.d("mmsport", (mmsportArr.get(i)));
        Log.d("proxy", (proxyArr.get(i)));
        Log.d("port", (portArr.get(i)));
        Log.d("mcc", (getString(R.string.mcc)));
        values.put("name", nameArr.get(i));
        values.put("apn", ApnArr.get(i));
        values.put("mmsc", mmscArr.get(i));
        values.put("mmsproxy", mmsproxyArr.get(i));
        values.put("mmsport", mmsportArr.get(i));
        values.put("proxy", proxyArr.get(i));
        values.put("port", portArr.get(i));
        values.put("mcc", (getString(R.string.mcc)));




        if ((tm.getSimOperator()).equals(getString(R.string.numeric_tmo))) {
            values.put("numeric", getString(R.string.numeric_tmo));
            values.put("mnc", (getString(R.string.mnc_tmo)));
        } else if ((tm.getSimOperator())
                .equals(getString(R.string.numeric_att))) {
            values.put("numeric", getString(R.string.numeric_att));
            values.put("mnc", (getString(R.string.mnc_att)));
        }
        return values;
    }

    /*
     * Delete APN data where the indicated field has the values Entire table is
     * deleted if both field and value are null
     */
    private void DeleteAPNs(String field, String[] values)
            throws SecurityException {
        int c = 0;
        c = getContentResolver().delete(APN_TABLE_URI, null, null);
        if (c != 0) {
            String s = "APNs Deleted:\n";
            Log.d(TAG, s);

        }

    }

    /*
     * Return all column names stored in the string array
     */
    private String getAllColumnNames(String[] columnNames) {
        String s = "Column Names:\n";
        for (String t : columnNames) {
            s += t + ":\t";
        }
        return s + "\n";
    }

    /*
     * Copy all data associated with the 1st record Cursor c. Return a
     * ContentValues that contains all record data.
     */
    private ContentValues copyRecordFields(Cursor c) {
        if (c == null)
            return null;
        int row_cnt = c.getCount();
        Log.d(TAG, "Total # of records: " + row_cnt);
        ContentValues values = new ContentValues();//
        if (c.moveToFirst()) {
            String[] columnNames = c.getColumnNames();
            Log.d(TAG, getAllColumnNames(columnNames));
            String row = "";
            for (String columnIndex : columnNames) {
                int i = c.getColumnIndex(columnIndex);
                row += c.getString(i) + ":\t";
                // if (i>0)//Avoid copying the id field
                // id to be auto-generated upon record insertion
                values.put(columnIndex, c.getString(i));
            }
            row += "\n";
            Log.d(TAG, row);
            Log.d(TAG, "End Of Records");
        }
        return values;
    }

    // showAlert displays the text contained in message as an alert
    public void showAlert(String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(message).setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        ConfigFinalActivity.this.finish();
                    }
                });
        mErrorAlert = builder.create();
        mErrorAlert.show();
    }

    // showErrorAlert displays an alert with layout and a title
        private void showErrorAlert(int layoutRes, String title) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            // Get the layout inflater
            LayoutInflater inflater = ConfigFinalActivity.this.getLayoutInflater();

            // Inflate and set the layout for the dialog
            // Pass null as the parent view because its going in the dialog layout
            builder.setTitle(title)
                    .setView(inflater.inflate(layoutRes, null))
                    .setPositiveButton(getString(R.string.assisted_button),
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    startActivity(new Intent(
                                            Settings.ACTION_APN_SETTINGS));
                                    try {
                                        showNotification();
                                    } catch (SAXException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    } catch (ParserConfigurationException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                }
                            });
            mErrorAlert = builder.create();
            mErrorAlert.show();
        }

    // showNotification starts the process of sending notifications to the bar
    // to assist the user in updating the data settings on ICS and later
    // versions of Android
    @SuppressWarnings("deprecation")
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    void showNotification() throws SAXException, ParserConfigurationException {

        String field = getString(R.string.config_name_label);
        Log.d("FIELD", field);
        String value = Values.get("name").toString();
        Log.d("VALUES", value);
        int mId = 1;
        String title = "1 of " + TotalSteps + " (Update " + field + ":)";
        Notification.Builder mBuilder = new Notification.Builder(this)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle(title).setContentText(value);
        Intent resultIntent = new Intent(this, NotificationActivityForMultiProf.class);
        resultIntent.putExtra(field, value);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(
                getApplicationContext(), 0, resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        // mId allows you to update the notification later on.
        mNotification = mBuilder.getNotification();
        mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
        mNotificationManager.notify(mId, mNotification);
        finish();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        if (mNotification != null) {
            outState.putString("NOTIFICATIONB", mNotification.toString());
        }
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        if (mErrorAlert != null)
            mErrorAlert.dismiss();
    }

    private int updateTable() throws IOException, SAXException,
            ParserConfigurationException {
        int insertResult = -1;
        // returned value if table is not properly updated

        try {

            ContentValues values = new ContentValues();
            // Query the carrier table for the current data settings
            Cursor c = getContentResolver().query(APN_TABLE_URI, null,
                    "current=?", new String[] { "1" }, null);
            values = copyRecordFields(c);
            // Copy the NET10 settings into values

            // Replace T-Mo/ATT Data settings if there is no SIM or
            // NET10/T-Mo/ATT SIM is
            // present
            if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT
                    || (tm.getSimOperator())
                            .equals(getString(R.string.numeric_tmo))) {

                // delete all APNs before adding new APNs
                DeleteAPNs("numeric=?",
                        new String[] { getString(R.string.numeric_tmo) });
                // Insert NET10 Data Settings into Carrier table

                insertResult = InsertAPN();

            } else if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT
                    || (tm.getSimOperator())
                            .equals(getString(R.string.numeric_att))) {
                // Delete all APNs before adding new APNs
                DeleteAPNs("numeric=?",
                        new String[] { getString(R.string.numeric_att) });
                // Insert NET10 Data Settings into Carrier table

                insertResult = InsertAPN();

    //      } else
                // non NET10/ non T-Mo SIM/non ATT SIM
        //      showAlert(getString(R.string.insert_net10_dialog));
            }   } catch (SecurityException e) {
        //  showErrorAlert(R.layout.assisted_settings,
        //          getString(R.string.assited_title));
            Log.d(TAG, e.getMessage());
        }
        return insertResult;
    }

    private void completeUpdate() {
        // Displaying final layout after pre-ICS automatic settings update
        setContentView(R.layout.completion);
    //  TextView mCompleted = (TextView) findViewById(R.id.done_text1);
    //  String mDoneText = String.format(getString(R.string.done_text1));
    //  CharSequence styledText = Html.fromHtml(mDoneText);

    //  mCompleted.setText(styledText);
        mAssistUpdateButton = (Button) findViewById(R.id.assist_update_btn);
        mAssistUpdateButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    public void tryagain() {
        // Displaying final layout after failure of pre-ICS automatic settings
        // update
        //setContentView(R.layout.tryagain);
        String tryAgainText = "";
        CharSequence styledTryAgainText;
//
//      tryAgainText = String.format(getString(R.string.tryagain_text1),
//              TotalSteps);
//      styledTryAgainText = Html.fromHtml(tryAgainText);
//      TextView tryAgain1 = (TextView) findViewById(R.id.tryagain_text1);
//      tryAgain1.setText(styledTryAgainText);
//
//      tryAgainText = String.format(getString(R.string.tryagain_text2),
//              TotalSteps);
//      styledTryAgainText = Html.fromHtml(tryAgainText);
//      TextView tryAgain2 = (TextView) findViewById(R.id.tryagain_text2);
//      tryAgain2.setText(styledTryAgainText);
//
//      tryAgainText = String.format(getString(R.string.tryagain_text3),
//              TotalSteps);
//      styledTryAgainText = Html.fromHtml(tryAgainText);
//      TextView tryAgain3 = (TextView) findViewById(R.id.tryagain_text3);
//      tryAgain3.setText(styledTryAgainText);

    }

    // This function return a cursor to the table holding the
    // the APN configurations (Carrier table)
    public Cursor getConfigTableCursor() {
        return getContentResolver()
                .query(APN_TABLE_URI, null, null, null, null);
    }

    public ArrayList<String> getnameArr() {

        return nameArr;
    }

    public ArrayList<String> getApnArr() {

        return ApnArr;
    }

    public ArrayList<String> getMMSCArr() {

        return mmscArr;
    }

    public ArrayList<String> getMmscProxyArr() {

        return mmsproxyArr;
    }

    public ArrayList<String> getMmsPortArr() {

        return mmsportArr;
    }

    public int getCount() {
        return count;
    }

    public ArrayList<String> getProxyArr() {

        return proxyArr;
    }

    public ArrayList<String> getPortArr() {

        return portArr;

    }

}
4

1 回答 1

0

首先,您永远不会填写公共静态字段 Values,因此 Values.get("name") 将返回 null,因此对 null 变量调用 toString()。您尝试在代码中创建名为 Values(或值)的不同变量,但您从未将任何内容(除了一个空的新对象)分配给 Values 字段,也没有直接在 Values 字段上调用任何 setter 方法。

于 2013-08-16T14:45:29.320 回答