2014-09-19 32 views
0

编辑时: 我不断获得空指针异常,当我尝试打电话sendTextMessage,和我不能”找出为什么...... 有趣的是,它并不总是发生,但往往确实如此。的Android NullPointerException异常发送短信

下面的代码:

package com.prolink.rute; 
import android.app.ProgressDialog; 
import android.content.BroadcastReceiver; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 


public class SendActivity extends ActionBarActivity { 
    Button tourInput; 
    Button tourInputWithout; 
    EditText editNote; 
    ListView list; 

    TextView labelDate; 
    TextView labelaOdredista; 

    Bundle extras; 

    String startName; 
    String finishName; 
    String strDate; 
    String strNote=""; 
    String name; 

    int option; 
    int nDrivers; 

    NetworkClass net; 
    DBHelper db; 
    DateClass dat; 
    DriverClass[] drivers; 


    // ---------------- Activiti OnCreate() ---------------- 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent intent = getIntent(); 
     extras = intent.getExtras(); 

     option = extras.getInt("option"); 
     startName = extras.getString("start"); 
     finishName = extras.getString("finish"); 

     net = new NetworkClass(this); 
     db = new DBHelper(this); 
     dat = new DateClass(this); 

     if(option == 2) 
      strDate = dat.tommorowDate(); 
     else if(option == 10) 
      strDate = extras.getString("_datue"); 
     else 
      strDate = dat.danasnjiDatum(); 


     new SetTheContent().execute(); 
    }// end void onCreate() 




    // ------------------ onBackPressed() ------------------ 
    @Override 
    public void onBackPressed() { 
     // TODO Auto-generated method stub 
    } 






    // ------------------ Creating the ActionBar ------------------ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // TODO Auto-generated method stub 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.action_bar_2, menu); 
     return super.onCreateOptionsMenu(menu); 
    }// end boolean onCreateOptionsMenu() 





    // ------------------ Selecting the ActionBar option ------------------ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 
     int id = item.getItemId(); 

     switch(id){ 
      case R.id.option_back: 
       finish(); 
       break; 

     case R.id.option_home: 
       Intent intent = new Intent(SendActivity.this, StartActivity.class); 
       startActivity(intent); 
       break; 
     } 

     return super.onOptionsItemSelected(item); 
    }// end boolean onOptionsItemsSelected() 









    // ------------------ Setting the content ------------------ 
    private class SetTheContent extends AsyncTask<Void, Void, Void>{ 
     private ProgressDialog pd; 

     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
      pd = new ProgressDialog(SendActivity.this); 
      pd.setMessage("Setting the content..."); 
      pd.setCancelable(false); 
      pd.show(); 
     }// end void onPreExecute() 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      int[] ids = extras.getIntArray("selected_drivers"); 
      nDrivers = ids.length; 

      drivers = new DriverClass[nDrivers]; 
      for(int i=0; i<nDrivers; i++){ 
       drivers[i] = new DriverClass(); 
       drivers[i] = db.returnDriver(ids[i]); 
      } 

      return null; 
     }// end void doInBackground() 

     protected void onPostExecute(Void Result){ 
      super.onPostExecute(Result); 
      if (pd.isShowing()) 
       pd.dismiss(); 
      setMyContent(); 
      DriversAdapter adapter = new DriversAdapter(SendActivity.this, drivers,  nDrivers, strDate); 
      list.setAdapter(adapter); 
     } 
    }// end class SetTheContent 






    // ------------------ Sending tour to server, sending SMS ------------------ 
    private class TourInput extends AsyncTask<Boolean, Void, Boolean>{ 

     private ProgressDialog pd; 
     Boolean _sms; 


     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
      pd = new ProgressDialog(SendActivity.this); 
      pd.setMessage("Unos ture ..."); 
      pd.setCancelable(false); 
      pd.show(); 
     }// end void onPreExecute() 



     @Override 
     protected Boolean doInBackground(Boolean... params) { 
      // TODO Auto-generated method stub 
      _sms = params[0]; 
      boolean success = net.potvrdiVezu(); 
      if(option == 10){ 
       String _start = extras.getString("_start"); 
       String _finish = extras.getString("_finish"); 
       if(net.deleteTour(Integer.parseInt(drivers[0].returnID()), _start, _finish, strDate) == 0) 
        success = false; 
       if(net.tourInput(Integer.parseInt(drivers[0].returnID()), startName, finishName, strDate, strNote) == 0) 
        success = false; 
      }//if 
      else{ 
       if(success){ 
        for(int i=0; i<nDrivers; i++){ 
         if(net.tourInput(Integer.parseInt(drivers[i].returnID()), startName, 
           finishName, strDate, strNote) == 0){ 
          success = false; 
          break; 
         } 
        }// for 
       } 
      }// else 
      return success; 
     }// end Void doInBackGround() 



     protected void onPostExecute(Boolean Result){ 
      super.onPostExecute(Result); 

      if (pd.isShowing()) 
       pd.dismiss(); 

      if(Result){ 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         if(option == 10){ 
          int tour_id = extras.getInt("tour_id"); 
          db.deleteTure(tour_id); 
          db.tourInsert(Integer.parseInt(drivers[0].returnID()), startName, finishName, datum); 
          if(_sms){ 
           String smsTour = "Change: " + startName + " - " + finishName + 
               ", date: " + strDate; 
           String smsNote = " Note: " + strNote; 
           String smsText = smsTour + smsNote; 

           Log.e("smsText", smsText); 
           smsSend(drivers[0].returnNumber(), smsTour, drivers[0].returnName()); 
           smsSend(drivers[0].returnNumber(), smsNote, drivers[0].returnName()); 


           db.smsInsert(Integer.parseInt(drivers[0].returnID()), dat.strDateTime(), smsText); 
           net.smsInsert(DBHelper.SMS_ID, Integer.parseInt(drivers[0].returnID()), dat.dateTime(), smsText); 
          } 
         }// if(option..) 

         else{ 
          for(int i=0; i<nDrivers; i++){ 
           db.tourInsert(Integer.parseInt(drivers[i].returnID()), startName, finishName, strDate); 
           if(_sms){ 
            String smsTour = "Tour: " + startName + " - " + finishName + 
                 ", date: " + strDate; 
            String smsNote = " Note: " + strNote; 

            String smsDrivers = ""; 
            for(int k=0; k<nDrivers-1; k++) 
             smsDrivers += drivers[k].returnName() + ", "; 
            smsDrivers += drivers[nDrivers - 1].returnName(); 

            String smsText = smsTour + smsNote + " " + smsDrivers; 

            Log.e("smsText", smsText); 

            smsSend(drivers[i].returnNumber(), smsTour, drivers[i].returnName()); 
            smsSend(drivers[i].returnNumber(), smsNote, drivers[i].returnName()); 
            if(nDrivers > 1) 
             smsSend(drivers[i].returnNumber(), smsDrivers, drivers[i].returnName()); 

            db.smsInsert(Integer.parseInt(drivers[i].returnID()), dat.dateTime(), smsText); 
            net.smsInsert(DBHelper.SMS_ID, Integer.parseInt(drivers[i].returnID()), dat.datumVrijeme(), smsText); 
           } 
          } 

         }// else(option..) 

         Intent intent = new Intent(SendActivity.this, StartActivity.class); 
         startActivity(intent); 
        }// run() 
       }).start(); 
      } 

      else 
       Toast.makeText(SendActivity.this, "Failed input", Toast.LENGTH_SHORT).show();   
     }// end void onPostExecute() 

    }// end class TourInput 







    // ------------------ Set the content ------------------ 
    private void setMyContent(){ 
     setContentView(R.layout.activity_send); 

     tourInput = (Button) findViewById(R.id.button_tourInput); 
     tourInputWithout = (Button) findViewById(R.id.button_tourInput2); 
     editNote = (EditText) findViewById(R.id.edit_note); 
     list = (ListView) findViewById(R.id.list_send_drivers); 
     labelDate = (TextView) findViewById(R.id.label_send_datum); 
     labelaOdredista = (TextView) findViewById(R.id.label_send_destinations); 

     labelDate.setText(DateClass.formatDate(strDate)); 
     labelaOdredista.setText(startName + "\t\t-\t\t" + finishName); 


     tourInput.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       strNote = editNote.getText().toString(); 
       if(strNote.isEmpty()) 
        strNote = "-"; 
       Log.e("Note:", strNote); 

       if(net.hasNet()) 
        new TourInput().execute(true); 
       else 
        Toast.makeText(SendActivity.this, "No Network", Toast.LENGTH_SHORT).show(); 
      }// end onClick() 
     });// end setOnClickListener() 



     tourInputWithout.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       strNote = editNote.getText().toString(); 
       if(strNote.isEmpty()) 
        strNote = "-"; 
       if(net.hasNet()) 
        new TourInput().execute(false); 
       else 
        Toast.makeText(SendActivity.this, "No Network", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    }// end void setMyContent() 




    // ------------------ Sending SMS ------------------ 
    private void smsSend(String number, String message, String name_){ 
     SmsManager sms = SmsManager.getDefault(); 
     name= name_; 

     try{ 
      sms.sendTextMessage(number, null, message, null, null); 
     } 
     catch(IllegalArgumentException e){ 
      Log.e("SMS error", e.getMessage().toString()); 
     } 
     catch(Exception e){ 
      Log.e("SMS Exception", e.getMessage().toString()); 
     } 
    }// end void smsSend() 
} 

我想通了,有时候是因为变量“strDate”和“strNote”引发的异常,但在logcat中的内容是存在的,它打印出...

logcat的:

09-20 13:31:25.310: D/dalvikvm(14101): GC_FOR_ALLOC freed 163K, 4% free 6469K/6727K, paused 57ms 
09-20 13:31:25.340: I/dalvikvm-heap(14101): Grow heap (frag case) to 6.856MB for 513744-byte allocation 
09-20 13:31:25.440: D/dalvikvm(14101): GC_CONCURRENT freed 0K, 4% free 6970K/7239K, paused 2ms+3ms 
09-20 13:31:25.980: I/dalvikvm(14101): Could not find method android.widget.LinearLayout$LayoutParams.<init>, referenced from method android.support.v7.internal.view.menu.ActionMenuView$LayoutParams.<init> 
09-20 13:31:25.980: W/dalvikvm(14101): VFY: unable to resolve direct method 8268: Landroid/widget/LinearLayout$LayoutParams;.<init> (Landroid/widget/LinearLayout$LayoutParams;)V 
09-20 13:31:25.980: D/dalvikvm(14101): VFY: replacing opcode 0x70 at 0x0000 
09-20 13:31:26.590: D/dalvikvm(14101): GC_CONCURRENT freed 69K, 3% free 7317K/7495K, paused 4ms+4ms 
09-20 13:31:26.780: D/CLIPBOARD(14101): Hide Clipboard dialog at Starting input: finished by someone else... ! 
09-20 13:31:32.060: D/dalvikvm(14101): GC_CONCURRENT freed 121K, 3% free 7587K/7815K, paused 3ms+5ms 
09-20 13:31:32.680: D/dalvikvm(14101): GC_CONCURRENT freed 307K, 5% free 7748K/8135K, paused 26ms+19ms 
09-20 13:31:34.600: D/dalvikvm(14101): GC_CONCURRENT freed 461K, 7% free 7741K/8263K, paused 5ms+6ms 
09-20 13:31:37.460: D/dalvikvm(14101): GC_CONCURRENT freed 170K, 4% free 8044K/8327K, paused 5ms+3ms 
09-20 13:31:43.680: E/Note:(14101): fffffffff 
09-20 13:31:43.740: E/smsText(14101): Tour: ŠUMARIJA BRINJE - CEDAR d.o.o. - NAŠICE, date: 2014-09-21 Note: fffffffff BREZARIĆ MLADEN 
09-20 13:31:43.800: W/dalvikvm(14101): threadid=14: thread exiting with uncaught exception (group=0x401be760) 
09-20 13:31:43.810: E/AndroidRuntime(14101): FATAL EXCEPTION: Thread-17 
09-20 13:31:43.810: E/AndroidRuntime(14101): java.lang.NullPointerException 
09-20 13:31:43.810: E/AndroidRuntime(14101): at com.prolink.rute.SendActivity.smsSend(SendActivity.java:412) 
09-20 13:31:43.810: E/AndroidRuntime(14101): at com.prolink.rute.SendActivity.access$1(SendActivity.java:399) 
09-20 13:31:43.810: E/AndroidRuntime(14101): at com.prolink.rute.SendActivity$UnosTure$1.run(SendActivity.java:312) 
09-20 13:31:43.810: E/AndroidRuntime(14101): at java.lang.Thread.run(Thread.java:1020) 
09-20 13:31:45.840: I/dalvikvm(14101): threadid=4: reacting to signal 3 
09-20 13:31:45.860: I/dalvikvm(14101): Wrote stack traces to '/data/anr/traces.txt' 

的logcat的总是指向两行代码与空指针异常相关联: smsSend(drivers[i].returnNumber(), smsTour, drivers[i].returnName())catch(Exception e){ Log.e(...); }

它就像是smsSend方法的第二个参数的字符串变量为空。当我传递一个随机的字符串作为第二个参数时,它会起作用但是,当我传递变量smsToursmsNote有时它抛出一个异常,有时不是。当我通过smsText,因为它总是抛出异常的说法..

我总是前打印logcat的那些字符串变量的值呼叫smsSend,这一切都很好..但由于某种原因抛出的例外..

我认为这可能是因为字符串的长度,但长度远远少于160个字符。 无论如何,我认为问题是与作为参数传递给sendSMS的字符串变量相关联,但不知道是什么和为什么...

任何帮助吗?

+2

可以请你发布logcat的? – Opiatefuchs 2014-09-19 13:44:36

+0

并且在你的代码中指出你正在得到空指针异常。 – DrkStr 2014-09-19 13:56:40

回答

0

好像sendTextMessage()没有工作的方法正确... 我用的方法sendMultiPartTextMessage()取代它,它工作正常:=)