黑马程序员技术交流社区

标题: 关于假期android发短信的小例子测试时为什么会崩溃掉 [打印本页]

作者: huyang936    时间: 2015-2-23 21:44
标题: 关于假期android发短信的小例子测试时为什么会崩溃掉
本帖最后由 huyang936 于 2015-2-23 22:13 编辑
  1. package cn.itcast.sendMess;

  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.telephony.SmsManager;
  5. import android.view.Menu;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.EditText;

  10. public class MainActivity extends Activity {
  11.         private EditText et_number;
  12.         private EditText et_messa;
  13.         private String number;//在外部类声明number
  14.         private String messa;//在外部类声明message
  15.         @Override
  16.         protected void onCreate(Bundle savedInstanceState) {
  17.                 super.onCreate(savedInstanceState);
  18.                 setContentView(R.layout.activity_main);
  19.                 // 获取号码文本对象
  20.                 et_number = (EditText) findViewById(R.id.editText1);
  21.                 // 获取信息文本对象
  22.                 et_messa = (EditText) findViewById(R.id.editText2);
  23.                 //获取电话号码
  24.                 number = et_number.getText().toString();
  25.                 //获取发送信息
  26.                 messa = et_messa.getText().toString();
  27.                 //获取按钮对象
  28.                 Button bt_send = (Button) findViewById(R.id.button1);
  29.                 //设置点击事件
  30.                 bt_send.setOnClickListener(new MyLisener());
  31.                
  32.         }
  33.        
  34.         class MyLisener implements OnClickListener
  35.         {

  36.                 @Override
  37.                 public void onClick(View v) {
  38.                         // TODO Auto-generated method stub
  39.                         SmsManager smsManager = SmsManager.getDefault();
  40.                         smsManager.sendTextMessage(number, null, messa, null, null);
  41.                 }
  42.         }


  43. }
复制代码
上面的代码崩溃掉了,如图:经验证是因为
电话号码number,和发送的消息messa声明的位置引起的
(为什么不可以呢?大神求解释!!!)

一下代码正常:
电话号码number,和发送的消息messa在内部类中获取




package cn.itcast.sendMess;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText et_number;
private EditText et_messa;
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  // 获取号码文本对象
  et_number = (EditText) findViewById(R.id.editText1);
  // 获取信息文本对象
  et_messa = (EditText) findViewById(R.id.editText2);
  //获取按钮对象
  Button bt_send = (Button) findViewById(R.id.button1);
  //设置点击事件
  bt_send.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    //获取电话号码
    String number = et_number.getText().toString();//在此处获取number
    //获取发送信息
    String messa = et_messa.getText().toString();//在此处获取message
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(number, null, messa, null, null);
   }
  });
}


图片1.png (90.54 KB, 下载次数: 56)

图片1.png

作者: a986875894    时间: 2015-2-24 00:53
...内部类访问外部类的东西要加关键字final啊 要么是获取不到的 所以应用程序就会挂掉 还有代码bug就是没有判断输入的电话号码和内容是不是空的 短信要分成段发送 要么短信太长就没了  还有就是用户如果写了好多好多文字不小心按到返回键就会输入的东西就都没了 用户会崩溃的 所以要做退出后在打开界面里边的内容还在的处理..
作者: huyang936    时间: 2015-2-24 10:16
a986875894 发表于 2015-2-24 00:53
...内部类访问外部类的东西要加关键字final啊 要么是获取不到的 所以应用程序就会挂掉 还有代码bug就是没有 ...

谢谢 回复的挺详细的。
另:局部内部类访问局部变量时,才需要加final修饰
而内部类不需要的

验证:
/*
测试内部类的访问
*/

class InnerDemo
{
        public static void main(String[] args)
        {
                new Outer().method();//最后,输出:电话号码 和 电话信息
        }
}

class Outer
{
        private String num;
        private String mess;
       
        public void method()
        {
                num = "电话号码";
                mess = "电话信息";
                new Inner().show();
        }
        class Inner
        {
                public void show()
                {
                        System.out.println("num:"+num);//此处可以访问method的局部变量
                        System.out.println("mess:"+mess);//此处可以访问method的局部变量

                }
        }
}
作者: huyang936    时间: 2015-2-24 10:22
a986875894 发表于 2015-2-24 00:53
...内部类访问外部类的东西要加关键字final啊 要么是获取不到的 所以应用程序就会挂掉 还有代码bug就是没有 ...

另外 在JDK1.8中,局部内部类访问局部变量时,前面不需要加final也可以访问了

验证:

/*
测试局部内部类访问局部变量
*/

class InnerDemo
{
        public static void main(String[] args)
        {
                new Outer().method();//打印出:电话号码 电话信息
        }
}

class Outer
{
        private String num;
        private String mess;
       
        public void method()
        {
                num = "电话号码";//局部变量
                mess = "电话信息";
                class Inner
                {
                        public void show()
                        {
                                System.out.println("num:"+num);//局部内部类访问局部变量
                                System.out.println("mess:"+mess);       
                        }
                }
                new Inner().show();
        }
}
作者: huyang936    时间: 2015-2-24 10:27
经测试崩溃的原因:是number(电话号码) 和 messa (发送的信息),没有正确接收导致的,直接什么都不输入,程序也会崩溃掉的。但,关于number(电话号码) 和 messa (发送的信息)为什么会接收不到(第一种代码形式:内部类访问了外部类的变量),还没弄懂,谢谢:D!:D
作者: wf111sxwf    时间: 2015-2-24 20:24
   这个函数是在 按钮被点击的时候 执行的 代码 而你的  第一部分代码  Number 和 Content定义在了外部类的成员位置  默认初始化 为NULL  那么 你的  监听类的 setTextMessage()方法 4个参数 均为空  那么 必须 崩溃啊
作者: huyang936    时间: 2015-2-24 20:35
wf111sxwf 发表于 2015-2-24 20:24
这个函数是在 按钮被点击的时候 执行的 代码 而你的  第一部分代码  Number 和 Content定义在了外部类的 ...

在OnCreate()函数中 做了获取 文本对象的 Number 和 Content的处理了,Number 和 Content不应该为空了啊!    是不是只有等点击了按钮 onClick()事件触发后,才获取Number 和 Content,也就是说 获取Number 和 Content必须要放在onClick()函数中才可以???
谢谢。
作者: wf111sxwf    时间: 2015-2-24 23:02
Oncreat  是在创建界面的时候调用的函数   一开始 肯定 文本框里 没东西啊   所以 是空啊  你在新建项目的时候 Oncreat 函数 不是 都默认加载布局么  这就是说 加载界面的时候 调用的就是  OnCreat方法啊
作者: huyang936    时间: 2015-2-24 23:05
wf111sxwf 发表于 2015-2-24 23:02
Oncreat  是在创建界面的时候调用的函数   一开始 肯定 文本框里 没东西啊   所以 是空啊  你在新建项目的 ...

所以如果要获取用户输入的信息,是不能放在这个OnCreate函数的吧。
作者: xyf19881010    时间: 2015-2-24 23:22
来学习学习
作者: wf111sxwf    时间: 2015-2-25 21:46
huyang936 发表于 2015-2-24 23:05
所以如果要获取用户输入的信息,是不能放在这个OnCreate函数的吧。

似的  应该放到点击OnclickListener 的Onclick 方法中




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2