黑马程序员技术交流社区

标题: 有关字符串的问题 [打印本页]

作者: 代文娟    时间: 2013-11-8 18:52
标题: 有关字符串的问题
为什么下述代码引起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. }
复制代码

作者: 寻丶丶觅    时间: 2013-11-8 18:57
NUllPointerException 空引用异常? 这个百度下吧
你在类里声明了一个String引用text,在构造函数中又定义了一个同名text引用。构造函数中写成this.text
作者: 寻丶丶觅    时间: 2013-11-8 18:59
补充一下,直接写text = s;也是可以的 因为传入的参数名为s,不强调也可以
作者: 零下五度的水    时间: 2013-11-8 19:05
public Test(String s)
05.        {
06.          String text=s;
07.        }
你的构造不是给字段传值,是新建了一个同名变量
作者: 冯国强    时间: 2013-11-8 20:04
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就会发生空引用异常。所以后面的就没执行。

作者: 魏-玉-彪    时间: 2013-11-8 23:34
  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是引用数据类型,,没有初始化地址指针就就没有地址可指,自然是空指针异常

作者: 何丛    时间: 2013-11-9 07:39
    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,引用为空值的对象调用其本身的函数会抛出空指针异常。




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