导航:首页 > 编程语言 > java的nullable

java的nullable

发布时间:2021-03-21 10:37:09

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 规范,但它长期处于搁置状态。很多第三方库提供了类似的注解,且得到了不同工具的支持,其中使用较多的有:

㈡ 请教,java源代码中 Override,Nullable 什么意思,小弟我从网

@Override 重载

@Nullable 参数可为null
@Nullable是用户自定义的注解,具体什么含义还要看情况,一般情况下这种Nullable用来实现null object模式

㈢ Java中Object... 代表什么意思

java方法中返回一个Object类型的对象表示这个方法返回的类型不受限制,因为Object是所有类的父类,返回任意一个类型都属于Object类型。
事例代码如下:
public class Demo2 {
private static int x = 1;//定义一个int型变量
public static void main(String[] args) {
System.out.println(a());
}
private static Object a(){//此返回Object类型的值
return x;//结果一个int型变量也可以
}
}
Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类。
Object类是Java中唯一没有父类的类。

其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法。
Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起。

㈣ java:hibernate 修改中的问题

说了啊,整形不能转换为字符型

㈤ 下面的Java实体类的注解是什么意思

与@overwrite 类似吧 是Java作用域描述符 貌似是自定义的 。不是注解

㈥ 为什么不能import javax.annotation.Nullable;

1、myeclipse导入项目中出现Multiple markers at this line这种错误,

解决办法:

把项目右键->build path->configure build path->java Compiler(左边那排中) ->

在右边的Compiler compliance level 修改版本为本myeclipse的jdk的版本,例如我的myeclipse的jdk版本1.6,就可以解决了。

2、myeclipse导入项目 JSP页面会出现Multiple annotations found at this line这个错误,

解决办法:

点击导航栏window-->preference-->MyEclipse-->Valdation-->将Manual和Build下复选框全部取消选择。

3、导入项目后出现项目上有红色×,解决办法:

(1)假如problem中有错误,就 找出problem中的问题,然后删除

(原因:虽然不是项目内部的错误,而且不会出错,但是导入的项目不会自动的改正,所以手动删除就可。)

4、eclipse中刚从服务器中导出工程:出现

Multiple markers at this line

- The import org.springframework cannot be

resolved

- The import org.springframework cannot be

resolved

的问题。

eclipse中刚从服务器中导出工程:

出现问题 4 的问题,报错的原因可能是:jdk版本不一致。

eclipse的版本默认的是1.7,而我用的是1.8,所以我的jre也是1.8,而1.8 的jre和eclipse的1.7不对应。

所以我有下载了一个jdk,重新安装,引用就解决了。(安装了两个jdk,用到哪一个就在高级变量里配置哪一个,

㈦ grails中blank和nullable的区别

Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,从而为大家带来一套能实现超高生产力的一站式框架。
Ruby on Rails开创了将一门强大的编程语言和一个坚持己见、提倡用通情达理的默认设置代替复杂配置的框架进行创造性结合的先河。然而,还有许多组织并没有做好从Java的安全保护伞下走出的准备,也没有打算放弃他们目前在Java上的投入。而Grails的出现,使得在一个以Java为中心的环境中实现同等生产力的想法成为可能。

Grails的插件系统

grails的插件系统也是其亮点之一。首先,和rails,django等web框架类似,基于微内核的思想,插件(可重用模块)是框架的一等公民。grails除了核心模块以外的功能几乎都是通过插件方式实现的。实际上,一个grails插件和一个grails应用基本是完全一样的,同样可以使用grails run-app命令来运行。区别仅在于一个插件的根目录下需要提供一个fooplugin.groovy文件,提供插件的一些描述信息。
grails插件基本可以做任何事情,grails社区已经提供了各式各样的插件,发布在grails官方插件源上。查看现有的官方插件,可以执行下面的命令:
grails list-plugins
安装插件可以执行以下命令:
grails install-plugin 插件名或插件路径

㈧ 如何更好地使用Java 8的Optional

Optional的出现不仅仅是为了解决一般对象的null判断的,应该是更好的配合java8的函数式风格编程

可以看到Optional里出现的静态方法都是这样的

比如以前你从数据库里获取一个对象,然后对他进行操作,可能是这样的代码

Objecto=.find()
if(o!=null)
{
doSomething(o)
}

但是用函数式编程来写就该是这样

Optional<Object>o=.find()
o.ifPresent(item->doSometing(o));


再举个例子,若你从数据库查出来的对象要是空的话需要报错,以前会这样写

Objecto=.find()
if(o==null)
{
throwException
}
returno;

但是现在你可以这样写

Optional<Object>o=.find()
returno.orElseThrow(Exception::new)

还可以简化成

return.find().orElseThrow(Exception::new);

所以总的来说,是为了更好的体现函数式编程的风格

各种语言虽然都有自己的特点,但是在将来以后,每个语言都可能或多或少融入其他语言的优点,这是一个必然的趋势,java也不例外

阅读全文

与java的nullable相关的资料

热点内容
网络中常用的传输介质 浏览:518
文件如何使用 浏览:322
同步推密码找回 浏览:865
乐高怎么才能用电脑编程序 浏览:65
本机qq文件为什么找不到 浏览:264
安卓qq空间免升级 浏览:490
linux如何删除模块驱动程序 浏览:193
at89c51c程序 浏览:329
怎么创建word大纲文件 浏览:622
袅袅朗诵文件生成器 浏览:626
1054件文件是多少gb 浏览:371
高州禁养区内能养猪多少头的文件 浏览:927
win8ico文件 浏览:949
仁和数控怎么编程 浏览:381
项目文件夹图片 浏览:87
怎么在东芝电视安装app 浏览:954
plc显示数字怎么编程 浏览:439
如何辨别假网站 浏览:711
宽带用别人的账号密码 浏览:556
新app如何占有市场 浏览:42

友情链接