導航:首頁 > 編程語言 > 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

友情鏈接