精华内容
下载资源
问答
  • C/C++ 下如何判断空指针

    万次阅读 2017-07-04 17:50:10
    今天在写C++代码,遇到一个很奇怪的问题,在Android JNI下判断一个指针是否为,但是发现 (NULL == ptr )或者 (nullptr== ptr )表达式均为真,然而ptr是刚new出来的,也有地址值。 这就很让人费解了,不信邪...

    今天在写C++代码,遇到一个很奇怪的问题,在Android JNI下判断一个指针是否为空,但是发现 (NULL == ptr )或者 (nullptr== ptr )表达式均为真,然而ptr是刚new出来的,也有地址值。

    这就很让人费解了,不信邪,写了这么多年的代码了,这种代码怎么看怎么没问题,同样的代码到x86环境下跑一次,却得到了我想要的结果,真是让人凌乱啊。。。


    最后只能祭出了我不太习惯的写法 (!ptr),这样就没问题了。


    通过血的教训总结一下,如果要判断一个指针是否为空,不要使用(NULL == ptr )或者 (nullptr== ptr )这种写法,在不同的平台上可能有不同的结果。建议使用(!ptr)或(ptr) 之类的写法,这种写法在多数平台上都没歧义,只有一个统一的结果。 从此可以总结出,在不同的平台上,NULL可能会被定义为其他地址,当然这个地址都是非法不可访问的。此问题同样适用于C。

    虽然前种方法可读性比较高,但是在某些平台上真会把你坑的不要不要的,一切为了可移植性。

    展开全文
  • 概述在编程语言中,空指针(Null Pointer)是一个已宣告但并未指向一个有效对象的指针,许多程序利用空指针来表示某些特定条件,例如未知长度数组的结尾或某些无法运行的操作。在可选择类型(optional type)的编程语言...
    8abbf569947c0b9d76af36753e17ebb1.png

    概述

    在编程语言中,空指针(Null Pointer)是一个已宣告但并未指向一个有效对象的指针,许多程序利用空指针来表示某些特定条件,例如未知长度数组的结尾或某些无法运行的操作。在可选择类型(optional type)的编程语言中,空指针通常可以跟可为Null的类型(Nullable types)和空值(Nothing value)进行比较。

    空指针与未初始化的指针(uninitialized pointer)不同,空指针保证不会和有值的指针相等,而未初始化的指针则是要看所使用的编程语言或编译器而定,在部分编程语言环境下,未初始化的指针无法保证不与有值的指针相等,他可能因为存有存储器残值而指向了某个有效对象。

    ada920b82714ca7fb5076d0516c68044.png

    空指针异常

    当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:

    • 调用 null 对象的实例方法。
    • 访问或修改 null 对象的字段。
    • 将 null 作为一个数组,获得其长度。
    • 将 null 作为一个数组,访问或修改其时间片。
    • 将 null 作为 Throwable 值抛出。

    空指针异常原因

    1、当一个对象不存在时又调用其方法会产生异常obj.method() // obj对象不存在;

    2、当访问或修改一个对象不存在的字段时会产生异常obj.method() // method方法不存在;

    3、字符串变量未初始化;

    4、接口类型的对象没有用具体的类初始化;

    当一个对象的值为空时,你没有判断为空的情况。你可以试着把下面的代码前加一行代码:

    367a5f96004c4eb0d178badb63dc673d.png

    改成:

    f9376bedeee95646ced5acd7b4803793.png

    空指针的解决办法:

    重点关注报错发生的所在行,通过空指针异常产生的两条主要原因诊断具体的错误。同时为了避免空指针的发生,最好在做判断处理时将“null”或者空值放于设定的值之前。

    异常处理的语法规则

    1、try 语句不能单独存在,可以和catch、finally 组成

    try...catch...finally、try...catch、try...finally 三种结构,catch 语句可以有一个或多个,finally 语句最多一个,try、catch、finally 这三个关键字均不能单独使用。

    2、try、catch、finally 三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。

    3、多个catch 块时候,Java 虚拟机会匹配其中一个异常类或其子类,就执行这个catch 块,而不会再执行别的catch 块。

    4、throw 语句后不允许有紧跟其他语句,因为这些没有机会执行。

    5、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。

    50197c4850af0eb5b92c78a96042df5d.png

    Java空指针异常解决方法

    Throwable是所有错误或异常的超类,只有当对象是这个类的实例时才能通过Java虚拟机或者Java throw语句抛出。

    当Java运行环境发出异常时,会寻找处理该异常的catch块,找到对应的catch块之后,将异常交给catch块捕获。

    throwable的子类是exception和error,exception等;

    例如:

    45b6a283cb07ba0206bd8f1f655ea971.png

    第二行报空指针异常

    那么books对象为null,向上查找第一行中Dao.getData();

    那么进一步查看Dao对象是否为空,若不为空,则继续向上查找,找出为null的对象

    改进:

    1.增加条件判断

    1b9b0f5227144f69ebfc6c9ef47b6af5.png

    2.捕获异常

    4051dcf446aa4fbd96d0163e8e59bc3c.png
    展开全文
  • 项目中遇到的NullPointerException 分两种情况:1. 引用对象,即调用对象的方法或引用...对于别人接口的返回对象要做非空判断,因为我们不清楚获得的对象会不会为,对于Collection Map 我一般会调用Colle...

    项目中遇到的NullPointerException 分两种情况:

    1. 引用空对象,即调用空对象的方法或引用空对象的属性。

    2. 将8中基础类型的封装类赋值给对应的基础类。

    个人在做项目时,对NullPointerException的几点总结,请网友拍砖!!!多多提意见,

    1.对于别人接口的返回对象要做非空判断,因为我们不清楚获得的对象会不会为空,对于Collection Map 我一般会调用CollectionUtils MapUtils ,对于返回的String对象,我会调StringUtils.isNotEmpty()进行非空判断。他们中isNotEmpty不仅判断了NULL 还判断了空集合和空串。例如从数据中查询的结果。工作流中返回的定价URL

    2. 对于自己创建的对象,要留心对象进行哪些操作,中间会不会造成对象为空,如果可能加非空判断,尤其是对于集合的操作,很容易就报空指针!!!所以每次对操作集合时,我都会非常的留心。

    3. 对于前台的领域对象要非常的留心,因为这些对象是框架创建的,假如我没有在前台的文本框内输入值,虽然提交时后台获得的是空串,但发生NullPointerException的概率很高。

    4. 对于String 的操作尽量使用apache 的StringUtils类,与String相比这个是非常的安全。对于集合的操作使用apache的CollectionUtils 、MapUtils, 相比apache工具类的执行效率也非常的高,比如StringUtils.split();

    有人说过多的判断会影响性能,我个人认为这里的性能牺牲和系统的安全相比是微不足道的。

    展开全文
  • 在其他语言中比如(Java,c#)可以直接判断类的对象是否是null来判断类的对象是否为,但是在c++中由于指针的存在,不能直接判断类的对象,而应该判断指向对象的指针是否为。  C++语言中,对象没有和不的...

     在其他语言中比如(Java,c#)可以直接判断类的对象是否是null来判断类的对象是否为空,但是在c++中由于指针的存在,不能直接判断类的对象,而应该判断指向对象的指针是否为空。

            C++语言中,对象没有空和不空的概念,只有对象指针才有空和不空的概念
      判断对象指针是否为空只需要和NULL常量进行比较即可
      如果相等,则为空,否则不为空
      另外对象虽然没有空和不空的概念,但是有有效和无效的概念
      当对象的析构函数被调用之后,对象即成为一个无效对象
      一般可以用句柄法来判断
      当对象被构造的时候,在一个全局的映射表中注册该对象,获得一个唯一句柄
      判断的时候,用对象的句柄信息直接在映射表中进行查找,如果存在,则有效;如果不存在则无效
      析构对象的时候,同时从映射表中删除该对象的句柄信息

     

    这里还涉及到一个基础问题 就是指针的赋值,如下:

    int	*p1;	
    int	i=2;
    p1=&i;
    long *p2=3;	

    p2的赋值明显是错误的,long *p2=3  这是在把3这个地址赋值给指针变量p2 ,   但是3这个地址在计算中内存中是否可以访问(肯定不能访问)还是个未知数,这样很容易报错,非法访问内存,导致程序崩溃。

    在网上看到一位同学的说法,解释的更清晰点:

    long *p3=352; 这个和
    long * p3; 
    p3=352; //注意*不和p3这个变量名结合
    是一样的,把352赋值给p3,一是类型不匹配,再者如果真的赋值成功(用强制转换)那么p3指向的地址是352,这个地址不一定是可用的。
    long *p3;
    *p3=352;
    这段代码编译没错,向p3指向的地址中放入352这个数,但是p3的值没有初始化,它指向的地址不确定,所以p3现在是野指针,运行时也可能程序崩溃。总之,p3和*p3是不一样的。
    可以这样:
    long a;
    long * p3=&a;   //等价于 long * p3; p3=&a;
    *p3=352;
    这时*p3和a都是352了。
    
    char * c="abc";
    这个等价于
    char * c;
    c="abc";
    当然没问题,因为字符串或字符数组被编译器解析为地址。而字符串常量在编译时被编译器存贮在了静态的只读数据区。

     

    展开全文
  • 在实际的开发过程中,空指针异常是我们最讨厌的异常,为了防止空指针异常,我们不得不在代码里面写大量的非空判断。 伟大的计算机科学Tony Hoare曾经写到:“我认为null引用从...先举一个之间如何防止空指针异常而多...
  • Optional提供很多有用的方法,这样我们就不用显式进行空值检测,很好地解决了空指针异常处理的问题,比如可以使用isPresent()方法判断value是否为null,使用get()方法获取value值等等。Optional的构造方法是私有的,...
  • 本文介绍如何避免出现空指针异常。 首先你要知道空指针异常为什么会出现: 引用直接指向空对象,大概率是你没有取到某个对象; 将8种基础类型的封装类赋值给对应的基础类。 接下来看怎么防止异常: 1. 前台...
  • java 代码中如何预防空指针异常 项目中遇到的NullPointerException 分两种情况: 1. 引用空对象,即调用空对象的方法或引用空对象的属性。 2. 将8中基础类型的封装类赋值给对应的基础类。   个人在做项目时,...
  • str.isEmpty(),当字符串的值等于null的时候,运行代码就会抛出空指针异常,因为字符串为null的时候不能调用它的任何方法。 代码应该写成下面这样,首先要判断是否为null: String str="haha"; if(str!=null&...
  • 这样会给函数调用者埋下空指针异常的隐患,如果确定会有NULL,也需要在方法里给出详细的注释,说明出现NULL的情况,这样函数调用者就可以及时的对NULL情况做出判断和处理,尽可能的避免空指针异常。 如果作为方法...
  • Optional提供很多有用的方法,这样我们就不用显式进行空值检测,很好地解决了空指针异常处理的问题,比如可以使用isPresent()方法判断value是否为null,使用get()方法获取value值等等。 Optional的构造方法是私有的...
  • 原文链接判断应用被强杀在Application中定义一个静态变量,给一个初始值,然后在闪屏页面为这个变量重新赋值,接下来闪屏页面会跳转到主页面,我们在主页面对这个值进行判断,如果变量的值是初始值,则说明应用被强...
  • 作为2020第一篇文章,我就从常见的空指针异常来说起。万事开头难…盘它。 #第一种情况 对于接口的开发中,不可避免的会出现对入参是否为空进行判断。为了不显示的使用判断。可以用spring框架中的Assert断言来做异常...
  • Java代码中如何防止空指针异常

    千次阅读 2016-08-08 09:55:16
    项目中遇到的NullPointerException 分两种情况: 1. 引用对象,即调用对象的方法或引用对象的属性。...1.对于别人接口的返回对象要做非空判断,因为我们不清楚获得的对象会不会为,对于Colle
  • 示例如下: #include<bits/stdc++.h> using namespace std; struct Node { int index; Node *left,*right; }; Node* method() ... //定义空指针 ... //返回空指针 ... //判断是否为空指针 if(node==N
  • 项目中遇到的NullPointerException 分两种情况: 引用对象,即调用对象的方法或引用对象的属性。...1.对于别人接口的返回对象要做非空判断,因为我们不清楚获得的对象会不会为,对于Collect...
  • 基于判断逻辑的空指针引用故障检测,王锐强,金大海,空指针引用故障是程序中非常常见的一类故障,国内外有大量的机构组织在研究如何检测这类故障,但是大多数的成果都有其自身的局限

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 445
精华内容 178
关键字:

如何判断空指针