精华内容
下载资源
问答
  • NULL是什么

    千次阅读 2015-03-12 19:43:46
    对于NULL,大家都不会陌生。非常常用,尤其是在指针里面。 可是很奇怪,在很多编译器里,NULL是黑色的,它不是一个关键字。既然不是关键字,却不用定义就可以使用。

    对于NULL,大家都不会陌生。非常常用,尤其是在指针里面。
    可是很奇怪,在很多编译器里,NULL是黑色的,它不是一个关键字。既然不是关键字,却不用定义就可以使用。

    与其说NULL是一个关键字,不如说NULL是一个宏,一个定义在stdlib.h里的宏。
    翻看stdlib.h,可以得到答案

    #ifndef NULL
    #ifdef __cplusplus
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    #endif

    那么问题又来了,为什么在C和在C++中,NULL的定义不一样?0和((void*)0)有什么区别?

    (1)为什么C可以使用((void *)0)
    C支持从void *到任意指针的隐式转换

    (2)为什么C不使用0
    C也支持从0到空指针的转换。
    NULL的本质还是一个指针。把NULL赋值给一个整型时,应当有warning出现,以提示使用者检查代码。
    如果把NULL定义成0,就不会出现这样的warning,因此使用((void *)0)更好。

    (3)为什么C++可以使用0
    C++支持整数0到空指针的转换

    (4)为什么C++不使用((void *)0)
    C++不支持从void *到任意指针的隐式转换,指针转换必须显式转换

    展开全文
  • NULL是什么意思

    万次阅读 2019-02-16 12:40:31
    NULL是什么意思 NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。 对NULL这个值的任何比较都会生产一个NULL值。 您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。 使用IS NULL来进行...

    NULL是什么意思

    NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。

    对NULL这个值的任何比较都会生产一个NULL值。

    您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。

    使用IS NULL来进行NULL判断

    展开全文
  • 系统错误null是什么意思 Java中NULL用法的简单示例: public Employee getByName(String name) { int id = database.find(name); if (id == 0) { return null; } return new Employee(id); } 这种方法有什么...

    系统错误null是什么意思

    Java中NULL用法的简单示例:

    public Employee getByName(String name) {
      int id = database.find(name);
      if (id == 0) {
        return null;
      }
      return new Employee(id);
    }

    这种方法有什么问题?

    它可能返回NULL而不是对象-这是错误的。 在面向对象的范例中, NULL是一种可怕的做法,应不惜一切代价避免使用NULL 已经有一些关于这个意见已经发布,包括空引用,数十亿美元的错误由Tony Hoare的介绍和整个对象思想由大卫-韦斯特的书。

    在这里,我将尝试总结所有的参数,并举例说明如何避免使用NULL并使用适当的面向对象的结构代替它们。

    基本上,可以使用NULL两种替代方法。

    第一个是Null Object设计模式(最好的方法是使其成为常数):

    public Employee getByName(String name) {
      int id = database.find(name);
      if (id == 0) {
        return Employee.NOBODY;
      }
      return Employee(id);
    }

    第二种可能的替代方法是在无法返回对象时抛出异常 ,从而快速失败

    public Employee getByName(String name) {
      int id = database.find(name);
      if (id == 0) {
        throw new EmployeeNotFoundException(name);
      }
      return Employee(id);
    }

    现在,让我们看看反对NULL的参数。

    除了上面提到的Tony Hoare的演示文稿和David West的书以外,我在写这篇文章之前阅读了这些出版物:Robert Martin的Clean Code ,Steve McConnell的Code Complete ,John Sonmez的“ No”到“ Null”是否返回无效的不良设计? StackOverflow上的讨论。

    临时错误处理

    每次获取对象作为输入时,都必须检查它是否为NULL或有效的对象引用。 如果忘记检查,则NullPointerException (NPE)可能会在运行时中断执行。 因此,您的逻辑将受到多次检查以及if / then / else分支的污染:

    // this is a terrible design, don't reuse
    Employee employee = dept.getByName("Jeffrey");
    if (employee == null) {
      System.out.println("can't find an employee");
      System.exit(-1);
    } else {
      employee.transferTo(dept2);
    }

    这就是应该用C和其他命令式程序语言处理异常情况的方式。 OOP引入了异常处理,主要是为了摆脱这些临时的错误处理块。 在OOP中,我们让异常冒泡直到它们到达应用程序范围的错误处理程序,并且我们的代码变得更加简洁明了:

    dept.getByName("Jeffrey").transferTo(dept2);

    考虑NULL引用是过程编程的继承,请改用1)Null对象或2)异常。

    模棱两可的语义

    为了明确传达其含义,必须将函数getByName()命名为getByNameOrNullIfNotFound() 每个返回对象或NULL函数都应该发生相同的情况。 否则,代码阅读器不可避免地会产生歧义。 因此,为了保持语义的明确性,应为函数指定更长的名称。

    要摆脱这种歧义,请始终返回真实对象,空对象或引发异常。

    有人可能会争辩说,为了性能起见,我们有时必须返回NULL 例如,当地图中没有这样的项目时,Java中接口Map get()方法将返回NULL

    Employee employee = employees.get("Jeffrey");
    if (employee == null) {
      throw new EmployeeNotFoundException();
    }
    return employee;

    由于Map使用NULL ,因此此代码仅搜索地图一次。 如果我们将Map重构,以便其方法get()在未找到任何内容的情况下将引发异常,则我们的代码将如下所示:

    if (!employees.containsKey("Jeffrey")) { // first search
      throw new EmployeeNotFoundException();
    }
    return employees.get("Jeffrey"); // second search

    显然,这种方法的速度是第一种方法的两倍。 该怎么办?

    Map界面(对其作者没有冒犯)具有设计缺陷。 它的方法get()应该一直返回一个Iterator以便我们的代码如下所示:

    Iterator found = Map.search("Jeffrey");
    if (!found.hasNext()) {
      throw new EmployeeNotFoundException();
    }
    return found.next();

    顺便说一句,这正是C ++ STL map :: find()方法的设计方式。

    计算机思维与对象思维

    有人知道Java中的对象是指向数据结构的指针,而NULL是指向0x00000000的指针(在Intel x86处理器中为0x00000000 if (employee == null)可以理解if (employee == null)语句。

    但是,如果您开始将其作为一个对象来考虑,那么这种说法就没有意义了。 这是从对象角度看我们的代码的样子:

    - Hello, is it a software department?
    - Yes.
    - Let me talk to your employee "Jeffrey" please.
    - Hold the line please...
    - Hello.
    - Are you NULL?

    对话中的最后一个问题听起来很奇怪,不是吗?

    相反,如果他们在我们请求与Jeffrey通话后挂断电话,则会给我们造成麻烦(异常)。 那时,我们尝试再次致电或通知主管,我们无法联系Jeffrey并完成更大的交易。

    或者,他们可以让我们与不是Jeffrey的其他人交谈,但是可以帮助我们解决大多数问题,或者在我们需要“特定于Jeffrey”的东西时拒绝帮助(空对象)。

    缓慢失败

    上面的代码不是快速失败 ,而是尝试缓慢消失,并杀死其他人。 它没有让所有人都知道出了什么问题并且应该立即开始异常处理,而是向客户端隐藏了此故障。

    该参数与上面讨论的“临时错误处理”非常接近。

    最好使代码尽可能脆弱,让代码在必要时中断。

    使您的方法对它们操作的数据极为苛刻。 如果提供的数据不足或根本不适合该方法的主要使用场景,请让他们通过引发异常来抱怨。

    否则,返回一个Null对象,该对象暴露出一些常见行为,并在所有其他调用上引发异常:

    public Employee getByName(String name) {
      int id = database.find(name);
      Employee employee;
      if (id == 0) {
        employee = new Employee() {
          @Override
          public String name() {
            return "anonymous";
          }
          @Override
          public void transferTo(Department dept) {
            throw new AnonymousEmployeeException(
              "I can't be transferred, I'm anonymous"
            );
          }
        };
      } else {
        employee = Employee(id);
      }
      return employee;
    }

    可变和不完整的对象

    通常, 强烈建议设计时牢记不变性的对象。 这意味着对象在实例化过程中会获得所有必需的知识,并且在整个生命周期中都不会改变其状态。

    通常,在延迟加载中使用NULL值,以使对象不完整且可变。 例如:

    public class Department {
      private Employee found = null;
      public synchronized Employee manager() {
        if (this.found == null) {
          this.found = new Employee("Jeffrey");
        }
        return this.found;
      }
    }

    该技术尽管被广泛使用,但在OOP中却是一种反模式。 主要是因为它使对象负责计算平台的性能问题,而这是Employee对象不应该意识到的。

    对象不必管理状态并公开其与业务相关的行为,而必须处理其自身结果的缓存-这就是延迟加载的意义所在。

    缓存不是员工在办公室里做的事情,对吗?

    解决方案? 请勿以上述原始方式使用延迟加载。 相反,请将此缓存问题移至应用程序的另一层。

    例如,在Java中,您可以使用面向方面的编程方面。 例如, jcabi-aspects具有@Cacheable批注,用于缓存方法返回的值:

    import com.jcabi.aspects.Cacheable;
    public class Department {
      @Cacheable(forever = true)
      public Employee manager() {
        return new Employee("Jacky Brown");
      }
    }

    我希望这种分析令人信服,您将停止NULL您的代码!

    相关文章

    您可能还会发现以下有趣的帖子:

    翻译自: https://www.javacodegeeks.com/2014/09/why-null-is-bad.html

    系统错误null是什么意思

    展开全文
  • C语言的 NULL是什么

    千次阅读 2016-07-15 14:37:33
    C语言的 NULL是什么 悬赏分:0 - 解决时间:2007-12-13 22:22空指针是怎么利用的!举个例子好吗?比如:if(fp=("I:\\woailuo.c","r"==NULL) \*fp是文件指针*\对文件操作成功返回值就是空指针吗? 提问者: wchjai -...
    C语言的 NULL是什么 悬赏分:0 - 解决时间:2007-12-13 22:22空指针是怎么利用的!举个例子好吗?比如:if(fp=("I:\\woailuo.c","r"==NULL) \*fp是文件指针*\对文件操作成功返回值就是空指针吗? 提问者: wchjai - 初学弟子 一级 
    最佳答案检举
    NULL在实际的底层代码中就是0。比如int *p; // 这时候p的值由系统分配p=NULL;则p实际在bebug窗口看到的结果为0x00000000。--------------------------------关于你的代码:(1) if(fp=("I:\\woailuo.c","r"==NULL) 写错,没写fopen,还少个括号(2) 注释格式应该是/* */fopen函数的作用是按照一定格式打开一个文件,如果打开成功,则返回该文件的指针,如果失败,则返回空指针(NULL,或者可以直接认为是0)。所以,判断文件打开失败与否,应该这样写:if( ( fp=fopen("somefile.dat","r") ) != NULL ) /* 打开成功了,随便干点什么 */else /* 打开失败,显示出错信息 */ 1回答者: 风骚的可乐 - 千总 四级   2007-12-12 21:19我来评论>>提问者对于答案的评价:谢谢!C语言中的空指针、空指针常量、NULL & 02009年02月02日 22:39

    1. 什么是空指针常量(null pointer constant)?

      [6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.

      这里告诉我们:0、0L、'\0'、3 - 3、0 * 17 (它们都是“integer constant expression”)以及 (void*)0 (tyc: 我觉得(void*)0应该算是一个空指针吧,更恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);至于 C++ 系统,由于存在严格的类型转化的要求,void* 不能象 C 中那样自由转换为其它指针类型,所以通常选 0 作为空指针常量(tyc: C++标准推荐),而不选择 (void*)0。
    2. 什么是空指针(null pointer)?

      [6.3.2.3-3] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

      因此,如果 p 是一个指针变量,则 p = 0;、p = 0L;、p = '\0';、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;), p 都成为一个空指针,由系统保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。(tyc: 比如这里的(void*)0就是一个空指针。把它理解为null pointer还是null pointer constant会有微秒的不同,当然也不是紧要了)
    3. 什么是 NULL?

      [6.3.2.3-Footnote] The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant

      即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。(tyc:很多系统中的实现:#define NULL (void*)0,与这里的“a null pointer constant”并不是完全一致的)
    4. 空指针(null pointer)指向了内存的什么地方(空指针的内部实现)?

      标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具体请参见C FAQ

      幸运的是,在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示——如上所述,有时它们是不同的。
    5. 如何判断一个指针是否是一个空指针?

      这可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。例如,假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针,可以采用下列任意形式之一——它们在实现的功能上都是等价的,所不同的只是风格的差别。

      指针变量 p 是空指针的判断:
      if ( p == 0 )
      if ( p == '\0' )
      if ( p == 3 - 3 )
      if ( p == NULL )   /* 使用 NULL 必须包含相应的标准库的头文件 */
      if ( NULL == p )
      if ( !p )
      if ( p == q )
      ...

      指针变量 p 不是空指针的判断:
      if ( p != 0 )
      if ( p != '\0' )
      if ( p != 3 - 3 )
      if ( p != NULL )   /* 使用 NULL 必须包含相应的标准库的头文件 */
      if ( NULL != p )
      if ( p )
      if ( p != q )
      ...
    6. 可以用 memset 函数来得到一个空指针吗?

      这个问题等同于:如果 p 是一个指针变量,那么

      memset( &p, 0, sizeof(p) ); 和 p = 0;

      是等价的吗?

      答案是否定的,虽然在大多数系统上是等价的,但是因为有的系统存在着“非零空指针” (nonzero null pointer),所以这时两者不等价。由于这个原因,要注意当想将指针设置为空指针的时候不应该使用 memset,而应该用空指针常量或空指针对指针变量赋值或者初始化的方法。
    7. 可以定义自己的 NULL 的实现吗?兼答"NULL 的值可以是 1、2、3 等值吗?"类似问题

      [7.1.3-2] If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined.

      NULL 是标准库中的一个符合上述条件的 reserved identifier (保留标识符)。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。也就是说,如果是符合标准的程序,其 NULL 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。
    8. malloc 函数在分配内存失败时返回 0 还是 NULL?

      malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 “null pointer”(空指针):

      [7.20.3-1] If the space cannot be allocated, a null pointer is returned.

      对于空指针值,一般的文档(比如 man)中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 “null pointer”(空指针)。(tyc:一般系统中手册中都返回NULL,那我们就用NULL吧)

    请问 c语言中“\0”与NULL 的区别

     悬赏分:10 - 解决时间:2005-9-18 17:08 问题补充:他们在字符串中呢?例如 while(*pf) while(*pf!=0)有什么区别?提问者: sure0070 - 童生 一级 最佳答案检举\0 \为转义符,后跟数字为八进制,\0就是表示数字0NULL在头文件的定义也是0,没区别。它们指的都是ASCII字符集中的第一个字符,标志“空”的一个状态字。 while(*pf) while(*pf!=0)效果也一样,都是判断指针为空(假)做为终止循环的条件。指针这种用法一般是在调用函数中,会传递一个指针,然后返回已指向目标的指针,用户通过该指针就可以操纵所需功能了。如果调函数失败,返回的就是空指针。这可指导用户,对失败情况做另外的处理。 0回答者: 双色心情 - 见习魔法师 二级   2005-9-18 00:25我来评论>>提问者对于答案的评价:thanks

    注:

    在C语言中,

    NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值


    对于字符串的结尾,使用'\0',它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值

    在不同的系统中,

    NULL并非总是和0等同,NULL仅仅代表空值,也就是指向一个不被使用的地址,在大多数系统中,都将0作为不被使用的地址,所以就有了类似这样的定义

    #define NULL 0

    但并非总是如此,也有些系统不将0地址作为NULL,而是用其他的地址,所以说,千万别将NULL和0等价起来,特别是在一些跨平台的代码中,这更是将给你带来灾难。

    展开全文
  • Java: null是什么??

    千次阅读 多人点赞 2019-05-02 20:01:17
    null是什么? 在学习过对象的实例化之后, 我们知道对象的实例化就是为对象的创建开辟存储空间。 对于一条实例化语句:Student stu=new Student(); //语句1 先是声明一个名为stu的Student类型变量,然后利用new...
  • NULL是什么

    千次阅读 2017-04-07 15:17:24
    对于写程序的你们来说NULL或许已经很不陌生了,但是对于不同的情况下有时候也会懵一下,因为我最近在处理c语言...1.大多数人的回答:"NULL就是系统定义特殊的0,把你初始化的指针指向它,可以防止“野指针”的恶果。
  • RadioGroup下的RadioButton设置属性button=@null是什么含义
  • jsp页面用request.getAttribute去取值,取到的的值是在页面显示null是什么原因
  • Java中的Null是什么

    千次阅读 2017-09-01 23:42:12
    1)首先,null是关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错。 2)就像每种基本类型都有默认值一样,如int默认值为0,boolean的默认值为false...
  • 知识补充:Android开发...1、null是什么:null虽然能代表一个不确定的对象,但null本身不是对象,也不是Object的实例。 今天在代码中遇到个问题: 没错,就是dead code(死代码,即不会执行的代码)。需明确
  • > /dev/null是什么

    千次阅读 2018-01-19 17:14:51
    if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi 表示$link这个变量的内容是否匹配/........ 比如设计一个函数是否包含字串:isContains(){ if expr ${1} : '.*'...
  • web.xml <servlet-name>BookSearch ... <param-name>user <param-value>test ...public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException{ ... 这个user一直是null
  • 1、null是什么:null本身不是对象,也不是Object的实例。
  • null:这个关键词大家都不陌生,但是大家一定不太明白它是什么类型的,或者它在内存中有什么作用,又或者它是不是一个空指针等等,我在这总结了下null 的“意义”。 当我们为一个引用变量初始化=null例如: ...
  • NULL 是什么NULL 是一个指向内存地址 0 的特殊常量。按照惯例,它通常被用来表示空值或无数据。在上面的代码中,我们使用 NULL 来表示虽然我们有一个数据指针,但它目前还没有指向任何内容。在本书的后续...
  • collate chinese_prc_ci_as null 是什么意思

    千次阅读 2008-04-23 16:40:00
    collate chinese_prc_ci_as null 是什么意思我们在create table时经常会碰到这样的语句,例如:CorpName nvarchar(10) collate chinese_prc_ci_as null,那它到底是什么意思呢?不妨看看下面: 语法COLLATE ::= { ...
  • ![图片](https://img-ask.csdn.net/upload/201705/14/1494729293_906958.jpg)![图片](https://img-ask.csdn.net/upload/201705/14/1494729315_369357.jpg)![图片]...
  • 回复:null是什么数据类型

    千次阅读 2007-03-26 15:28:00
    编译通过了,而且运行时也没有错误,问题是null到底是什么数据类型,或者说java如何进行转型的    答  1. String 是 Object 的子类 。所以函数在调用时优先选择作为子类的String。 运行结果是String ...
  • strtok()这一个让人很迷惑的函数。在MSDN中查到它的用法,如下: // crt_strtok.c// compile with: /W3// In this program, a loop uses strtok// to print all the tokens
  • javascript 什么是null什么是undefine

    千次阅读 2017-08-02 14:57:43
    学过java的同志们肯定都知道,null代表的空,而且null可以自动的转化为false;但是在js中。我们除了有undefined,还有null,,对于表达空,应该只有null才对,后来百度的时候明白了1995年JavaScript诞生时,最初像...
  • NULL到底是什么

    2015-01-20 19:57:47
    /* A null pointer constant. */ #if defined (_STDDEF_H) || defined (__need_NULL) #undef NULL /* in case has defined it. */ #define NULL ((void *)0) #endif /* NULL not defined and or need NUL
  • 指针赋值为NULL;是什么意思呢?

    千次阅读 多人点赞 2014-04-02 09:41:43
    这个NULL是什么意思?  网上百度了下,有人说NULL=0;是在头文件中定义的;  首先要说的是:非堆分配的内存是不需要free的。  再说p=NULL;指针的变化是 p指向了一个地址为0的内存,这就提醒别人不要对这个...
  • JAVA中有八种基本数据类型,他们在初始化的时候会被赋予初始值。 byte -&gt; 0 short -&gt; 0 int -&...(看起来像一个空格) ...引用类型对象初始化会被赋予初始值:null String ...
  • 什么返回值是null

    2017-11-09 06:48:42
    function sqlhelper(datas) { var msgjson=null; mui.ajax({ ... data : datas, ...success里的msg能够成功获取数据的,但是赋值给msgjson后整个函数的返回值就是null,求教什么问题
  • 使用typeof null得到的null是object.所以,它是一个对象??? 先看一个小栗子. 前提:引用W3school Boolean() 函数 当要转换的值是至少有一个字符的字符串、非 0 数字或对象时,Boolean() 函数将返回 true。 ...
  • 由于null代表的空指针(大多数平台下值为 0x00),因此,null 的类型标签 0,typeof null也因此返回"object" 虽然 typeof null 会输出 object,但是这只是 JS 存在的一个悠久 Bug。在 JS 的最初版...
  • JS的数据类型有六种 Boolean ...在JS的最初版本中使用的是32位系统,为了性能考虑使用低位存储变量的类型信息,000开头的是对象,null是全0,所以将null误判为Object了,虽然现在的内部类型判断...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,717
精华内容 7,886
关键字:

null是什么