空指针异常在编译时会被发现吗
⑴ 关于java中空指针异常
空指针异常产生的主要原因如下:
(1)当一个对象不存在时又调用其方法会产生异常obj.method() // obj对象不存在
(2)当访问或修改一个对象不存在的字段时会产生异常obj.method() // method方法不存在
(3)字符串变量未初始化;
(4)接口类型的对象没有用具体的类初始化,比如:
List lt;会报错
List lt = new ArrayList();则不会报错了
当一个对象的值为空时,你没有判断为空的情况。你可以试着把下面的代码前加一行代码:
if(rb!=null && rb!="")
改成:
if(rb==null);
if(rb!==null&&rb!="") 或者if((“”).equals(rb))
空指针的解决办法:
重点关注报错发生的所在行,通过空指针异常产生的两条主要原因诊断具体的错误。同时为了避免空指针的发生,最好在做判断处理时将“null”或者空值放于设定的值之前。
⑵ java 空指针异常问题
因为当他返回的时候会隐式的加一个.intValue方法,,,当返回null的时候,就会出现空指针报错了,,,可以反编译class文件看看
⑶ 编译器不会强制程序员处理哪种异常
在java编译器中,是不会强制要求程序员进行处理Runtime异常的。
RuntimeException类及其子类的实例被称为运行时异常,即UnChecked Exception。
我们较为常见的NullPointerException(空指针异常)和 IndexOutOfBoundsException(数组越界异常),对于这些Runtime异常。
在java编译器中是不会强制要求程序员进行处理或声明的(有些IDE可能会给可能出现Runtime异常问题的提示,但不会报错)。
常见的RunTime异常几种如下:
NullPointerException - 空指针引用异常。
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常。
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常。
IndexOutOfBoundsException - 下标越界异常。
NegativeArraySizeException - 创建一个大小为负数的数组错误异常。
NumberFormatException - 数字格式异常。
SecurityException - 安全异常。
UnsupportedOperationException - 不支持的操作异常。
⑷ 常见JAVA运行时异常有哪些
1,java.lang.NullPointerException
这个异常的解释是 "程序遇上了空指针 ",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。
2,java.lang.ClassNotFoundException
异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可
3,java.lang.
这个异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了.
4,java.lang.NoSuchMethodError
方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。
5,java.lang.IndexOutOfBoundsException
索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。
6,java.lang.NumberFormatException
数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
7,java.sql.SQLException
Sql语句执行异常
8,java.io.IOException
输入输出异常
9,java.lang.IllegalArgumentException
方法参数错误
10java.lang.IllegalAccessException
无访问权限异常
(4)空指针异常在编译时会被发现吗扩展阅读:
Java技术应用领域:
1、Android应用
许多的 Android应用都是Java程序员开发者开发。虽然 Android运用了不同的JVM以及不同的封装方式,但是代码还是用Java语言所编写。相当一部分的手机中都支持JAVA游戏,这就使很多非编程人员都认识了JAVA。
2、在金融业应用的服务器程序
Java在金融服务业的应用非常广泛,很多第三方交易系统、银行、金融机构都选择用Java开发,因为相对而言,Java较安全 。大型跨国投资银行用Java来编写前台和后台的电子交易系统,结算和确认系统,数据处理项目以及其他项目。
3、网站
Java 在电子商务领域以及网站开发领域占据了一定的席位。开发人员可以运用许多不同的框架来创建web项目,SpringMVC,Struts2.0以及frameworks。即使是简单的 servlet,jsp和以struts为基础的网站在政府项目中也经常被用到。例如医疗救护、保险、教育、国防以及其他的不同部门网站都是以Java为基础来开发的。
4、嵌入式领域
Java在嵌入式领域发展空间很大。在这个平台上,只需130KB就能够使用Java技术(在智能卡或者传感器上)。
5、大数据技术
Hadoop以及其他大数据处理技术很多都是用Java,例如Apache的基于Java的HBase和Accumulo以及 ElasticSearchas。
6、高频交易的空间
Java平台提高了这个平台的特性和即使编译,他同时也能够像 C++ 一样传递数据。正是由于这个原因,Java成为的程序员编写交易平台的语言,因为虽然性能不比C++,但开发人员可以避开安全性,可移植性和可维护性等问题。
7、科学应用
Java在科学应用中是很好选择,包括自然语言处理。最主要的原因是因为Java比C++或者其他语言相对其安全性、便携性、可维护性以及其他高级语言的并发性更好。
⑸ 空指针错误是什么意思
所谓的空指针异常,就是一个指针是空指针,你还要去操作它,既然它指向的是空对象,它就不能使用这个对象的方法。比如上面的s假如为null,你还要用s的方法,比如s.equals( String x);那么就会产生空指针异常。
产生空指针异常的原因:
(1) 当一个对象不存在时又调用其方法会产生异常 obj.method() // obj对象不存在
(2) 当访问或修改一个对象不存在的字段时会产生异常 obj.method() // method方法不存在
(5)空指针异常在编译时会被发现吗扩展阅读:
空指针正常工作意义:
在许多语言,这不是一个单独的转义序列,而是八进制转义序列,单个八进制数字为0;因此,‘ ’不能跟随任何数字0通过7;否则它被解释为更长的八进制转义序列的开始。被在使用中发现各种语言的其他转义序列 00,x00,z,或的Unicode表示u0000。
表示空字符的能力并不总是意味着生成的字符串将被正确解释,因为许多程序将认为null作为字符串的结尾。因此,键入它的能力(在未经检查的用户输入的情况下)会创建一个称为空字节注入的漏洞,并可能导致安全漏洞。
空字符以逗号表示是^@。在Windows上,可以通过按住Ctrl键,然后按@(这通常需要同时按下⇧ Shift并按下数字2键)。
参考资料:网络——空指针
⑹ 空指针引用故障是什么故障
以计算机为例,无法获取未定义或null引用的属性的原因是网页中调用了本机的office控件(Excel或Word等)。需要设置IE选项:允许各种ActiveX控件运行。
一般是由于原生javascript的confirm函数被重写造成的,检查下页面内是否已经定义了其他名为confirm的函数,或页面引用的js文件中是否定义。
(6)空指针异常在编译时会被发现吗扩展阅读:
注意事项:
null是关键字,像public,static,final,是大小写敏感的,不能将null写成Null或NULL,否则编译器会报错。
包含null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。
在使用equals判断字符串是否相等时,要将常量字符串放在equals的左边,防止空指针异常。
null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null。
⑺ 检查时异常为什么不能捕获再抛出 编译不通过
这是java的默认配置。
当你把一个异常定义在方法的throws定义中,你就可以不处理这个异常,系统会自动把该异常抛出。 而RuntimeException则是java设计中所有方法都默认定义在throws中了,所以只要你不捕获,就会一层一层的往上抛出。
除非你显示的标准要捕获它。否则不会被捕获。也不会造成编译异常。
其实大部分的RuntimeException,要么是系统异常。无法处理。例如网络问题。
要么就是应该在UT中发现的,例如空指针异常。
⑻ java中的空指针异常怎么解决
原文:https://www.hu.com/question
你这个问题的解决
问题定位:
在堆栈异常信息的第一行就可以定位到是哪里出了空指针,倘若这里不是你写的类,可以往下翻一下,找到你写的类,就是这里出现的空指针。
问题解决:
对一个空对象调用里面的方法或者属性的时候会报空指针,检查这个对象为什么是空即可。
Java 空指针异常的若干解决方案
Java 中任何对象都有可能为空,当我们调用空对象的方法时就会抛出 NullPointerException 空指针异常,这是一种非常常见的错误类型。我们可以使用若干种方法来避免产生这类异常,使得我们的代码更为健壮。本文将列举这些解决方案,包括传统的空值检测、编程规范、以及使用现代 Java 语言引入的各类工具来作为辅助。
运行时检测
最显而易见的方法就是使用 if (obj == null) 来对所有需要用到的对象来进行检测,包括函数参数、返回值、以及类实例的成员变量。当你检测到 null 值时,可以选择抛出更具针对性的异常类型,如 IllegalArgumentException,并添加消息内容。我们可以使用一些库函数来简化代码,如 Java 7 开始提供的 Objects#requireNonNull 方法:
public void testObjects(Object arg) {
Object checked = Objects.requireNonNull(arg, "arg must not be null");
checked.toString();}
Guava 的 Preconditions 类中也提供了一系列用于检测参数合法性的工具函数,其中就包含空值检测:
public void testGuava(Object arg) {
Object checked = Preconditions.checkNotNull(arg, "%s must not be null", "arg");
checked.toString();
}
我们还可以使用 Lombok 来生成空值检测代码,并抛出带有提示信息的空指针异常:
public void testLombok(@NonNull Object arg) {
arg.toString();
生成的代码如下:
public void testLombokGenerated(Object arg) {
if (arg == null) {
throw new NullPointerException("arg is marked @NonNull but is null");
}
arg.toString();
}
这个注解还可以用在类实例的成员变量上,所有的赋值操作会自动进行空值检测。
编程规范
·通过遵守某些编程规范,也可以从一定程度上减少空指针异常的发生。
使用那些已经对 null 值做过判断的方法,如 String#equals、String#valueOf、以及三方库中用来判断字符串和集合是否为空的函数:
if (str != null && str.equals("text")) {}
if ("text".equals(str)) {}
if (obj != null) { obj.toString(); }
String.valueOf(obj); // "null"
// from spring-core
StringUtils.isEmpty(str);
CollectionUtils.isEmpty(col);
// from guava
Strings.isNullOrEmpty(str);
// from commons-collections4
CollectionUtils.isEmpty(col);
·如果函数的某个参数可以接收 null 值,考虑改写成两个函数,使用不同的函数签名,这样就可以强制要求每个参数都不为空了:
public void methodA(Object arg1) {
methodB(arg1, new Object[0]);
}
public void methodB(Object arg1, Object[] arg2) {
for (Object obj : arg2) {} // no null check
}
·如果函数的返回值是集合类型,当结果为空时,不要返回 null 值,而是返回一个空的集合;如果返回值类型是对象,则可以选择抛出异常。Spring JdbcTemplate 正是使用了这种处理方式:
// 当查询结果为空时,返回 new ArrayList<>()
jdbcTemplate.queryForList("SELECT * FROM person");
// 若找不到该条记录,则抛出
jdbcTemplate.queryForObject("SELECT age FROM person WHERE id = 1", Integer.class);
// 支持泛型集合
public <T> List<T> testReturnCollection() {
return Collections.emptyList();
}
静态代码分析
Java 语言有许多静态代码分析工具,如 Eclipse IDE、SpotBugs、Checker Framework 等,它们可以帮助程序员检测出编译期的错误。结合 @Nullable 和 @Nonnull 等注解,我们就可以在程序运行之前发现可能抛出空指针异常的代码。
但是,空值检测注解还没有得到标准化。虽然 2006 年 9 月社区提出了 JSR 305 规范,但它长期处于搁置状态。很多第三方库提供了类似的注解,且得到了不同工具的支持,其中使用较多的有:
javax.annotation.Nonnull:由 JSR 305 提出,其参考实现为 com.google.code.findbugs.jsr305;
org.eclipse.jdt.annotation.NonNull:Eclipse IDE 原生支持的空值检测注解;
e.umd.cs.findbugs.annotations.NonNull:SpotBugs 使用的注解,基于 findbugs.jsr305;
org.springframework.lang.NonNull:Spring Framework 5.0 开始提供;
org.checkerframework.checker.nullness.qual.NonNull:Checker Framework 使用;
android.support.annotation.NonNull:集成在安卓开发工具中;
- <dependency>
- <groupId>com.github.spotbugs</groupId>
- <artifactId>spotbugs-annotations</artifactId>
- <version>3.1.7</version>
- </dependency>
- @NonNull
- private Object returnNonNull() {
- // 错误:returnNonNull() 可能返回空值,但其已声明为 @Nonnull
- return null;
- }
- @CheckForNull
- private Object returnNullable() {
- return null;
- }
- public void testReturnNullable() {
- Object obj = returnNullable();
- // 错误:方法的返回值可能为空
- System.out.println(obj.toString());
- }
- private void argumentNonNull(@NonNull Object arg) {
- System.out.println(arg.toString());
- }
- public void testArgumentNonNull() {
- // 错误:不能将 null 传递给非空参数
- argumentNonNull(null);
- }
- public void testNullableArgument(@CheckForNull Object arg) {
- // 错误:参数可能为空
- System.out.println(arg.toString());
- }
- import org.checkerframework.checker.nullness.qual.Nullable;
- @Nullable
- private Object returnNullable() {
- return null;
- }
- public void testReturnNullable() {
- Object obj = returnNullable();
- // 错误:obj 可能为空
- System.out.println(obj.toString());
- }
- private Object returnNonNull() {
- // 错误:方法声明为 @NonNull,但返回的是 null。
- return null;
- }
- private void argumentNonNull(Object arg) {
- System.out.println(arg.toString());
- }
- public void testArgumentNonNull() {
- // 错误:参数声明为 @NonNull,但传入的是 null。
- argumentNonNull(null);
- }
- // 这是 spring-core 中定义的类和方法
- public abstract class StringUtils {
- // str 参数继承了全局的 @NonNull 注解
- public static String capitalize(String str) {}
- @Nullable
- public static String getFilename(@Nullable String path) {}
- }
- // 错误:参数声明为 @NonNull,但传入的是 null。
- StringUtils.capitalize(null);
- String filename = StringUtils.getFilename("/path/to/file");
- // 错误:filename 可能为空。
- System.out.println(filename.length());
- Optional<String> opt;
- // 创建
- opt = Optional.empty();
- opt = Optional.of("text");
- opt = Optional.ofNullable(null);
- // 判断并读取
- if (opt.isPresent()) {
- opt.get();
- }
- // 默认值
- opt.orElse("default");
- opt.orElseGet(() -> "default");
- opt.orElseThrow(() -> new NullPointerException());
- // 相关操作
- opt.ifPresent(value -> {
- System.out.println(value);
- });
- opt.filter(value -> value.length() > 5);
- opt.map(value -> value.trim());
- opt.flatMap(value -> {
- String trimmed = value.trim();
- return trimmed.isEmpty() ? Optional.empty() : Optional.of(trimmed);
- });
- String zipCode = getUser()
- .flatMap(User::getAddress)
- .flatMap(Address::getZipCode)
- .orElse("");
- stringList.stream().findFirst().orElse("default");
- stringList.stream()
- .max(Comparator.naturalOrder())
- .ifPresent(System.out::println);
- val opt: Option[String] = Some("text")
- opt.getOrElse("default")
- opt match {
- case Some(text) => println(text)
- case None => println("default")
- opt.map(_.trim).filter(_.length > 0).map(_.toUpperCase).getOrElse("DEFAULT")
- val upper = for {
- text <- opt
- trimmed <- Some(text.trim())
- upper <- Some(trimmed) if trimmed.length > 0
- } yield upper
- upper.getOrElse("DEFAULT")
- var a: String = "text"
- a = null // 错误:无法将 null 赋值给非空 String 类型。
- val b: String? = "text"
- // 错误:操作可空类型时必须使用安全操作符(?.)或强制忽略(!!.)。
- println(b.length)
- val l: Int? = b?.length // 安全操作
- b!!.length // 强制忽略,可能引发空值异常
我建议使用一种跨 IDE 的解决方案,如 SpotBugs 或 Checker Framework,它们都能和 Maven 结合得很好。
SpotBugs 与 @NonNull、@CheckForNull
SpotBugs 是 FindBugs 的后继者。通过在方法的参数和返回值上添加 @NonNull 和 @CheckForNull 注解,SpotBugs 可以帮助我们进行编译期的空值检测。需要注意的是,SpotBugs 不支持 @Nullable 注解,必须用 @CheckForNull 代替。如官方文档中所说,仅当需要覆盖 @ParametersAreNonnullByDefault 时才会用到 @Nullable。
官方文档 中说明了如何将 SpotBugs 应用到 Maven 和 Eclipse 中去。我们还需要将 spotbugs-annotations 加入到项目依赖中,以便使用对应的注解。
以下是对不同使用场景的说明:
对于 Eclipse 用户,还可以使用 IDE 内置的空值检测工具,只需将默认的注解 org.eclipse.jdt.annotation.Nullable 替换为 SpotBugs 的注解即可:

Checker Framework 与 @NonNull、@Nullable
Checker Framework 能够作为 javac 编译器的插件运行,对代码中的数据类型进行检测,预防各类问题。我们可以参照 官方文档,将 Checker Framework 与 maven-compiler-plugin 结合,之后每次执行 mvn compile 时就会进行检查。Checker Framework 的空值检测程序支持几乎所有的注解,包括 JSR 305、Eclipse、甚至 lombok.NonNull。
Checker Framework 默认会将 @NonNull 应用到所有的函数参数和返回值上,因此,即使不添加这个注解,以下程序也是无法编译通过的:
Checker Framework 对使用 Spring Framework 5.0 以上的用户非常有用,因为 Spring 提供了内置的空值检测注解,且能够被 Checker Framework 支持。一方面我们无需再引入额外的 Jar 包,更重要的是 Spring Framework 代码本身就使用了这些注解,这样我们在调用它的 API 时就能有效地处理空值了。举例来说,StringUtils 类里可以传入空值的函数、以及会返回空值的函数都添加了 @Nullable 注解,而未添加的方法则继承了整个框架的 @NonNull 注解,因此,下列代码中的空指针异常就可以被 Checker Framework 检测到了:
Optional 类型
Java 8 引入了 Optional<T> 类型,我们可以用它来对函数的返回值进行包装。这种方式的优点是可以明确定义该方法是有可能返回空值的,因此调用方必须做好相应处理,这样也就不会引发空指针异常。但是,也不可避免地需要编写更多代码,而且会产生很多垃圾对象,增加 GC 的压力,因此在使用时需要酌情考虑。
方法的链式调用很容易引发空指针异常,但如果返回值都用 Optional 包装起来,就可以用 flatMap 方法来实现安全的链式调用了:
Java 8 Stream API 同样使用了 Optional 作为返回类型:
此外,Java 8 还针对基础类型提供了单独的 Optional 类,如 OptionalInt、OptionalDouble 等,在性能要求比较高的场景下很适用。
其它 JVM 语言中的空指针异常
Scala 语言中的 Option 类可以对标 Java 8 的 Optional。它有两个子类型,Some 表示有值,None 表示空。
除了使用 Option#isEmpty 判断,还可以使用 Scala 的模式匹配:
Scala 的集合处理函数库非常强大,Option 则可直接作为集合进行操作,如 filer、map、以及列表解析(for-comprehension):
Kotlin 使用了另一种方式,用户在定义变量时就需要明确区分 可空和不可空类型。当可空类型被使用时,就必须进行空值检测。
Kotlin 的特性之一是与 Java 的可互操作性,但 Kotlin 编译器无法知晓 Java 类型是否为空,这就需要在 Java 代码中使用注解了,而 Kotlin 支持的 注解 也非常广泛。Spring Framework 5.0 起原生支持 Kotlin,其空值检测也是通过注解进行的,使得 Kotlin 可以安全地调用 Spring Framework 的所有 API。
结论
在以上这些方案中,我比较推荐使用注解来预防空指针异常,因为这种方式十分有效,对代码的侵入性也较小。所有的公共 API 都应该使用 @Nullable 和 @NonNull 进行注解,这样就能强制调用方对空指针异常进行预防,让我们的程序更为健壮。
⑼ 空指针是什么意思
C/C++中有指针的概念,用于指向一个内存地址。当指针指向0(NULL)时,叫空指针,表示没有。
在面向对象的语言(如java)中,没有指针的概念,但它的变量就相当于指针。当一个变量没有指向任何对象时,通常赋予null值,习惯上也称为空指针(因为科班程序员都学过C),这时如果误认为有对象,并调用其方法或属性时,就会报空指针(Null Pointer)错误。