A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 代文娟 中级黑马   /  2013-11-8 18:52  /  1112 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么下述代码引起NUllPointerException异常?
  1. class Test
  2. {
  3.         private String text;
  4.         public Test(String s)
  5.         {
  6.           String text=s;
  7.         }
  8.         public static void main(String[] args)
  9.         {
  10.                 Test test=new Test("ABC");
  11.                 System.out.println(test.text.toLowerCase());
  12.                
  13.         }
  14.        
  15. }
复制代码

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

6 个回复

正序浏览
何丛 中级黑马 2013-11-9 07:39:00
7#
    class Test
    {
            private String text;
            public Test(String s)
            {
              String text=s;
            }
            public static void main(String[] args)
            {
                    Test test=new Test("ABC");
                    System.out.println(test.text.toLowerCase());
                  
            }
           
    }
构造函数初始化的时候,先将字符串"ABC"的在堆内存中的首地址传给s,然后在将s所指向的引用地址即"ABC"的首地址传给构造函数内定义的text,因为text是在构造函数内定义,属于局部变量,构造函数执行结束后,text所占用的栈内存空间就会被回收。成员变量private String text;会被默认初始化为null,引用为空值的对象调用其本身的函数会抛出空指针异常。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
  1. class Test
  2. {
  3.         private String text;                       //此处没有初赋值
  4.         public Test(String s)
  5.         {
  6.           String text=s;           //此处重新定义了 text局部变量,覆盖了 text 成员变量所以,并没有给成员变量赋值
  7. // 此处去掉 改为 text=s;       或this.text =s;
  8.         }
  9.         public static void main(String[] args)
  10.         {
  11.                 Test test=new Test("ABC");
  12.                 System.out.println(test.text.toLowerCase());
  13.                
  14.         }
  15.         
  16. }
复制代码
private String text;  没有完成初始化,而 String是引用数据类型,,没有初始化地址指针就就没有地址可指,自然是空指针异常
回复 使用道具 举报
class Test
{
       private String text;
       public Test(String s)
       {
              String text=s;
       }
       public static void main(String[] args)
      {
              Test test=new Test("ABC");
              System.out.println(test.text.toLowerCase());
      }
}
这里问题是构造函数中的问题,从主函数执行,先建立对象。建立对象时,将“ABC”赋值给构造函数中的变量text。执行完后,因该变量是局部变量。所以内存释放。而Test类中的私有变量text就会发生空引用异常。所以后面的就没执行。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
public Test(String s)
05.        {
06.          String text=s;
07.        }
你的构造不是给字段传值,是新建了一个同名变量
回复 使用道具 举报
补充一下,直接写text = s;也是可以的 因为传入的参数名为s,不强调也可以
回复 使用道具 举报
NUllPointerException 空引用异常? 这个百度下吧
你在类里声明了一个String引用text,在构造函数中又定义了一个同名text引用。构造函数中写成this.text
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马