2013-08-30 2 views
0

내가 널 포인터 예외를 받고 있어요 문제를 가로 질러 간다 (및 강제 종료) 라인에). 나는 다른 값강제 닫기 안드로이드

ConfigFinalActivity 소스 코드 조각을 디버깅을 시도했습니다

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; 

    public static ContentValues Values = new ContentValues(); 
    XmlParserHandlerFinal handler; 

    public static final Uri APN_TABLE_URI = Uri 
      .parse("content://telephony/carriers"); 
    public static final String Base_URL = "https://test.testsite555.com/REST/phoneSettings"; 
    public static InputStream stream = null; 
    UpdateActivity update; 
    public static String status, queryResult = ""; 

    /** 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(); 
     getArrayLists(); 
     /* 
     * boolean deleted = deleteFile("settings.xml");if(deleted){ 
     * Log.v("settings.xml","deleted"); }else 
     * Log.v("settings.xml","failed to delete the file"); 
     */ 
     if (ApnArr.isEmpty() || mmscArr.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_dialog)); 
      } 

     } else {// ICS and later versions 

      // Reduce number of steps to 6 
      TotalSteps = 6; 
      setContentView(R.layout.assist_instructions); 
      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); 

     } 
    } 

    private void getArrayLists() { 
     nameArr = handler.getnameArr(); 
     ApnArr = handler.getApnArr(); 
     mmscArr = handler.getMMSCArr(); 
     mmsproxyArr = handler.getMmscProxyArr(); 
     mmsportArr = handler.getMmsPortArr(); 
     proxyArr = handler.getProxyArr(); 
     portArr = handler.getPortArr(); 
     count = handler.getCount(); 
     result = handler.getResult(); 
    } 

나는 응용 프로그램이 있기 때문에 위의 코드에서 null 값의 충돌 알고 -하지만 난 알아내는 도움이 조금 필요 그것이 null 일 수 있습니다.

나는 문제가 다음 활동의 문제에 따른 것으로 판단 (하지만이 시점에서 확실하지 않다 -/중단 제안은 믿을 수 없을만큼 helful 것 디버깅) :

업데이트 작업 :

public class UpdateActivity extends Activity { 

    private TelephonyManager tm; 

    AlertDialog mConfirmAlert = null; 
    NetworkTask task; 
    ImageView image, text; 
    AlertDialog mErrorAlert = null; 
    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 AnimationDrawable mTextAnimation = null; 
    TextView mUpdatetext; 
    public static InputStream stream = null; 
    int version; 
    public static BigInteger iD1, iD2, mdN1, mdN2; 
    BigInteger[] id, mdnId; 
    public static String ICCID, MDN; 

    public static String caR; 

    public static int result; 
    private static final String LOG_TAG = "DataSettings"; 

    public static final String Base_URL = "https://someurl.testsite555.com/REST/phoneSettings"; 

    public static XmlParserHandlerFinal handler; 
    public static int TotalSteps = 8; 

    public FileInputStream fis; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // instance for xml parser class 
     handler = new XmlParserHandlerFinal(); 
     handler.setContext(this.getBaseContext()); 
     tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
     int networkType = tm.getNetworkType(); 
     int phoneType = tm.getPhoneType(); 
     version = android.os.Build.VERSION.SDK_INT; 
     // to get MDN(MCC+MNC) of the provider of the SIM and ICCID (Serial 
     // number of the SIM) 
     // and to check for the Carrier type 
     getImpVariablesForQuery(); 
     task = new NetworkTask(); 
     if (phoneType == TelephonyManager.PHONE_TYPE_CDMA 
       || (phoneType != TelephonyManager.PHONE_TYPE_GSM 
         && networkType != TelephonyManager.NETWORK_TYPE_GPRS 
         && networkType != TelephonyManager.NETWORK_TYPE_EDGE 
         && networkType != TelephonyManager.NETWORK_TYPE_HSDPA 
         && networkType != TelephonyManager.NETWORK_TYPE_HSPA 
         && networkType != TelephonyManager.NETWORK_TYPE_HSPAP 
         && networkType != TelephonyManager.NETWORK_TYPE_HSUPA 
         && networkType != TelephonyManager.NETWORK_TYPE_UMTS && networkType != TelephonyManager.NETWORK_TYPE_LTE)) { 
      // If the phone type is CDMA or 
      // the phone phone type is not GSM and the network type is none of 
      // the network types indicated in the statement 
      // Display incompatibility message 
      showAlert(getString(R.string.incomp_sm_dialog)); 
      // Network type is looked because some tablets have no phone type. 
      // We rely on network type in such cases 
     } else if (!(tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT 
       || (tm.getSimOperator()) 
         .equals(getString(R.string.numeric_tmo)) || (tm 
        .getSimOperator()).equals(getString(R.string.numeric_att)))) { 
      // if SIM is present and is NOT a T-Mo or ATT network SIM, 
      // display Error message alert indicating to use SM SIM 
      showAlert(getString(R.string.insert_sm_dialog)); 
     }// No SIM or SIM with T-Mo & ATT MNC MCC present 
     else if ((tm.getSimOperator()).equals(getString(R.string.numeric_tmo)) 
       || (tm.getSimOperator()) 
         .equals(getString(R.string.numeric_att))) { 
      // Device has T-Mo or ATT network SIM card MCC and MNC correctly 
      // populated 
      TotalSteps = 6; 
      setContentView(R.layout.updating); 

//   image = (ImageView) findViewById(R.id.updating_image); 
//   text = (ImageView) findViewById(R.id.updating_text); 
// 
//   text.setBackgroundResource(R.drawable.animation); 
//   mTextAnimation = (AnimationDrawable) text.getBackground(); 

      // AsyncTask to call the web service 

      task.execute(""); 

     } 
    } 

// @Override 
// public void onWindowFocusChanged(boolean hasFocus) { 
//  super.onWindowFocusChanged(hasFocus); 
//  // Animate GO button when corresponding window is in focus 
//  Animation a = AnimationUtils.loadAnimation(getBaseContext(), 
//    R.anim.image); 
//  a.setDuration(1000); 
//  a.setInterpolator(new Interpolator() { 
//   private final int frameCount = 16; 
// 
//   @Override 
//   public float getInterpolation(float input) { 
//    return (float) Math.floor(input * frameCount)/frameCount; 
//   } 
//  }); 
//  image.startAnimation(a); 
// 
//  mTextAnimation.start(); 
// } 

    private void getImpVariablesForQuery() { 

     long d = 1234; 
     BigInteger divisor = BigInteger.valueOf(d); 
     // to get MDN 
     MDN = tm.getLine1Number(); 
     // MDN = "7862125102"; 
     if (MDN.equals("")) { 
      mdN1 = null; 
      mdN2 = null; 
     } else { 

      Log.d("MDN", MDN); 
      BigInteger bInt = new BigInteger(MDN); 
      mdnId = bInt.divideAndRemainder(divisor); 
      // to retrieve ICCID number of the SIM 
      mdN1 = mdnId[1]; 
      System.out.println("MDN%1234 = " + mdN1); 
      mdN2 = mdnId[0]; 
      System.out.println("MDN/1234 = " + mdN2); 

     } 
     ICCID = tm.getSimSerialNumber(); 
     if (ICCID.equals("")) { 
      iD1 = null; 
      iD2 = null; 
     } else { 
      Log.d("ICCID", ICCID); 

      BigInteger bInteger = new BigInteger(ICCID); 
      id = bInteger.divideAndRemainder(divisor); 
      iD1 = id[1]; 
      System.out.println("ICCID%1234 = " + iD1); 
      iD2 = id[0]; 
      System.out.println("ICCID/1234 = " + iD2); 
     } 
     // Check for the Carrier Type 
     if ((tm.getSimOperator()).equals(getString(R.string.numeric_tmo))) { 
      caR = "TMO"; 
     } else if ((tm.getSimOperator()) 
       .equals(getString(R.string.numeric_att))) { 
      caR = "ATT"; 
     } 

    } 

    // method to save the ArrayLists from parser 
    public static void setArrayList() { 
     nameArr = handler.getnameArr(); 
     ApnArr = handler.getApnArr(); 
     mmscArr = handler.getMMSCArr(); 
     mmsproxyArr = handler.getMmscProxyArr(); 
     mmsportArr = handler.getMmsPortArr(); 
     proxyArr = handler.getProxyArr(); 
     portArr = handler.getPortArr(); 
     count = handler.getCount(); 
     result = handler.getResult(); 

    } 

    private 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) { 
         UpdateActivity.this.finish(); 
        } 
       }); 
     mConfirmAlert = builder.create(); 
     mConfirmAlert.show(); 
    } 

    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; 
    } 

    // AsyncTask to call web service 
    private class NetworkTask extends AsyncTask<String, Integer, InputStream> { 

     @Override 
     protected void onPreExecute() { 

      super.onPreExecute(); 

     } 

     @Override 
     protected InputStream doInBackground(String... params) { 

      try { 
       /* 
       * query the server for the data settings put the returned data 
       * settings into values 
       */ 
       // String charset = "UTF-8"; 
       // String param1 = "mdn1="; 
       // String param2 = "&mdn2="; 
       // String param3 = "&car="; 
       // String param4 = "&id1="; 
       // String param5 = "&id2="; 

       // String parameters = param1 + Mdn1 + param2 + Mdn2 + param3 
       // + Car + param4 + iD1 + param5 + iD2; 
       // String parameters = param1 + Mdn1 + param2 + Mdn2 ; 
       // URL = Base_URL + URLEncoder.encode(parameters, charset); 

       Log.i("url...", Base_URL); 

       stream = getQueryResults(Base_URL); 

      } catch (IOException e) { 

       Log.v(LOG_TAG, e.toString()); 
       e.printStackTrace(); 
      } catch (SAXException e) { 

       Log.v(LOG_TAG, e.toString()); 
       e.printStackTrace(); 
      } catch (Exception e) { 

       Log.v(LOG_TAG, e.toString()); 
       e.printStackTrace(); 
      } 

      return stream; 
     } 

     /* 
     * Sends a query to server and gets back the parsed results in a bundle 
     * urlQueryString - URL for calling the webservice 
     */ 
     protected synchronized InputStream getQueryResults(String urlQueryString) 
       throws IOException, SAXException, SSLException, 
       SocketTimeoutException, Exception { 
      // HttpsURLConnection https = null; 
      try { 
       // HttpsURLConnection https = null; 
       String uri = urlQueryString; 

       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

       // BasicNameValuePair username = new 
       // BasicNameValuePair("username", 
       // "nmundru"); 
       // BasicNameValuePair password = new 
       // BasicNameValuePair("password", 
       // "abc123"); 
       BasicNameValuePair mdn1, mdn2,id1,id2; 
       if (MDN.equals("")) { 
        mdn1 = new BasicNameValuePair("mdn1", null); 
        mdn2 = new BasicNameValuePair("mdn2", null); 
       } else { 
        mdn1 = new BasicNameValuePair("mdn1", mdN1.toString()); 
        mdn2 = new BasicNameValuePair("mdn2", mdN2.toString()); 

       } 

       BasicNameValuePair car = new BasicNameValuePair("car", caR); 
       if (ICCID.equals("")) { 
        id1 = new BasicNameValuePair("id1", null); 
        id2 = new BasicNameValuePair("id2", null); 
       } else { 
        id1 = new BasicNameValuePair("id1", 
          iD1.toString()); 
        id2 = new BasicNameValuePair("id2", 
          iD2.toString()); 
       } 

       // nameValuePairs.add(username); 
       // nameValuePairs.add(password); 
       nameValuePairs.add(mdn1); 
       nameValuePairs.add(mdn2); 
       nameValuePairs.add(car); 
       nameValuePairs.add(id1); 
       nameValuePairs.add(id2); 

       UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(
         nameValuePairs, "ISO-8859-1"); 
       KeyStore trustStore = KeyStore.getInstance(KeyStore 
         .getDefaultType()); 
       trustStore.load(null, null); 

       SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
       sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

       HttpParams params = new BasicHttpParams(); 
       HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
       HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

       SchemeRegistry registry = new SchemeRegistry(); 
       registry.register(new Scheme("http", PlainSocketFactory 
         .getSocketFactory(), 80)); 
       registry.register(new Scheme("https", sf, 443)); 

       ClientConnectionManager ccm = new ThreadSafeClientConnManager(
         params, registry); 

       HttpClient httpClient = new DefaultHttpClient(ccm, params); 
       params = httpClient.getParams(); 
       HttpClientParams.setRedirecting(params, true); 

       HttpPost httpPost = new HttpPost(uri); 
       httpPost.addHeader("Authorization", 
         getB64Auth("nmundru", "abc123")); 

       httpPost.setHeader("Content-Type", "text/plain; charset=utf-8"); 

       Log.v("httpPost", httpPost.toString()); 

       httpPost.setEntity(urlEncodedFormEntity); 
       HttpResponse httpResponse = httpClient.execute(httpPost); 
       System.out.println("response...." + httpResponse.toString()); 
       Log.v("response...", httpResponse.toString()); 

       stream = httpResponse.getEntity().getContent(); 

       // save the InputStream in a file 

       try { 

        FileOutputStream fOut = openFileOutput("settings.xml", 
          Context.MODE_WORLD_READABLE); 

        DataInputStream in = new DataInputStream(stream); 
        BufferedReader br = new BufferedReader(
          new InputStreamReader(in)); 
        String strLine; 
        while ((strLine = br.readLine()) != null) { 
         System.out.println(strLine); //to print the response 
         // in logcat 
         fOut.write(strLine.getBytes()); 

        } 
        fOut.close(); 

       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       fis = openFileInput("settings.xml"); 

      } catch (Exception e) { 
       Log.e(LOG_TAG, e.toString()); 

       // e.printStackTrace(); 
       tryagain(); 

      } finally { 
       // https.disconnect(); 
      } 

      return stream; 
     } 

     private String getB64Auth(String login, String pass) { 
      String source = login + ":" + pass; 
      String ret = "Basic " 
        + Base64.encodeToString(source.getBytes(), Base64.URL_SAFE 
          | Base64.NO_WRAP); 
      return ret; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 

     } 

     @Override 
     protected void onPostExecute(InputStream stream) { 
      super.onPostExecute(stream); 
      // This method is called to parse the response and save the 
      // ArrayLists 
      success(); 

     } 

    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 

     if (mErrorAlert != null) 
      mErrorAlert.dismiss(); 
    } 

    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); 

    } 

    public void success() { 

     // to parse the response 
     try { 
      handler.getQueryResponse(fis); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // set method to save the ArryaLists from the parser 
     setArrayList(); 
     Intent i = new Intent(this, ConfigFinalActivity.class); 
     startActivity(i); 
     finish(); 

    } 

    public int getResult() { 

     return result; 
    } 

} 
이 라인

nameArr = handler.getnameArr(); 

NPE는 다음 문제가것을해야 알 수 있습니다 있는지 확인하는 경우

+0

예외가 발생한 행을 알아내는 스택 추적은 어떻습니까? –

+0

그냥 200 줄의 코드를 덤프해서 디버깅 할 수는 없습니다. 'NPE'가 어느 라인에서 발생하는지 더 잘 알 수 있습니다. –

+0

'handler'는 어디에서 인스턴스화됩니까? – codeMagic

답변

0

이 시점에서은 null입니다. 이 줄이 NPE을 던질 유일한 방법입니다. 그리고 방대한 코드를 살펴보면 은 사용하는 메서드 (getArrayLists();)를 호출하기 전에 인스턴스화되지 않은 것 같습니다. 여기에 선언하십시오.

XmlParserHandlerFinal handler; 

그러나이 값을 사용하려고 시도한 적이 없습니다.

getnameArr();과 같은 메소드를 호출하기 전에이 코드를 에 인스턴스화해야합니다. 다른 Activity에서는 인스턴스화하지만이 인스턴스에는 인스턴스화하지 않습니다.