激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JAVA與SQL 中的null與NULL解析

JAVA與SQL 中的null與NULL解析

2021-12-02 12:51FXBStudy Java教程

這篇文章主要介紹了JAVA與SQL 中的null與NULL解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

 

一、前言

null與NULL不都是表示空值嗎?這有什么值得深入討論的的?首先你在編寫Java代碼時使用過NULL嗎?大概用IDE用習慣了,自動給生成以及糾正沒有注意過也很正常。同樣道理在數據庫中的疑問我就不提問了。如果你不了解它們之間的區別,在Java操作數據庫的時候,很有可能會出現一系列的BUG。

 

看下面我做的一個簡單的測試:

實驗一:使用null

JAVA與SQL 中的null與NULL解析

實驗二:使用NULL

JAVA與SQL 中的null與NULL解析

預備知識:當聲明了變量或者類卻沒有賦初值,Java會自動進行賦初值。賦值原則是整數類型int、byte、short、long的自動賦值為0,帶小數點的float、double自動賦值為0.0,boolean的自動賦值為false,其他各種引用類型變量自動賦值為null。

 

二、Java中的null

首先聲明,null是Java的關鍵字,并且大小寫是敏感的。

Java是一種面向對象的高級編程語言,但是null本身不是對象,也不是Objcet的實例,null表示類或對象(包括字符串)是不存在的,不代表任何對象或實例,可以將null賦給引用類型變量,但不可以將null賦給基本類型變量;

與其對應,也是最為常見的一個異常:java.lang.NullPointerException

 

引發這個異常的情況有:

  • 調用 null 對象的實例方法
  • 訪問或修改 null 對象的字段
  • 將 null 作為一個數組,獲得其長度
  • 將 null 作為一個數組,訪問或修改其時間片
  • 將 null 作為 Throwable 值拋出

上面的所有情況都是null所引發的,只知其然,而不知其所以然是在開發中經常碰到這個異常的原因,要想盡量避免它,就必須深入的了解它。

 

2.1 大小寫

因為null是大小寫敏感的,所以Null,NULL等這類寫法在Java代碼中都是非法的。但是現在的IDE的功能太過于強大了,會自動修正或者填充,所以使用IDE基本不必考慮這個問題。

思考:因為IDE過于方便,使得我們會忽略很多細節,對于初學者而言建議從最簡單的文本編輯器與命令行的方式進行學習。不要出現都學得挺多了,但是連一個main函數都敲不出來,那就尷尬了。

 

2.2 默認的初值

null是任何引用類型的默認值,不嚴格的說是所有object類型的默認值。這對所有變量都是適用的,如成員變量、局部變量、實例變量、靜態變量(但當你使用一個沒有初始化的局部變量,編譯器會警告你)。

JAVA與SQL 中的null與NULL解析

 

2.3 類型

null 既不是對象也不是一種類型,它僅是一種特殊的值,你可以將其賦予任何引用類型,你也可以將null轉化成任何類型。

?
1
2
3
4
5
6
7
String str = null; // null can be assigned to String
Integer itr = null; // you can assign null to Integer also
Double dbl = null// null can also be assigned to Double
 
String myStr = (String) null; // null can be type cast to String
Integer myItr = (Integer) null; // it can also be type casted to Integer
Double myDbl = (Double) null; // yes it's possible, no error

null 可以賦值給引用變量,你不能將 null 賦給基本類型變量,例如int、double、float、boolean。但是可以賦值給他們的包裝類類型,如上面的代碼中使用的。

正如這個特性,也會導致一個異常的發生:先將 null 賦給包裝類型,然后將包裝類型賦值給基本類型,編譯器完全是可以通過的,但是運行時會拋出空指針異常。

JAVA與SQL 中的null與NULL解析

當然了編程的時候誰閑著沒事這樣做,但是很有可能無意中卻這樣做了,所以一定要謹慎。

這個異常時在自動拆箱的過程中,關于自動拆箱裝箱可以參考《JAVA 包裝類型 及 易錯陷阱》。

 

2.4 對null的檢查

 

== 與 !=

這種比較是最為常用的比較,但是也有其缺點。

something == null,這種寫法完全沒有任何異常,但是很容易失誤導致錯誤。因為這種寫法如果少一個等號,這樣就變成了賦值,而代碼仍然是可以正常運行的。所以更加安全的寫法是 null == something,當我們將等號少寫一個,會直接報異常,所以這種寫法更加安全。

注意:不能使用其他算法或者邏輯操作,例如小于或者大于。

 

instanceof

Java 中的 instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof 通過返回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個實例。

如果使用了帶有 null 值的引用類型變量,instanceof 操作將會返回false。

?
1
2
3
4
5
6
Integer iAmNull = null;
if(iAmNull instanceof Integer){
   System.out.println("iAmNull is instance of Integer");
}else{
   System.out.println("iAmNull is NOT an instance of Integer");
}

輸出結果為:

iAmNull is NOT an instance of Integer

 

equals

在比較的時候除了 == 之外,我們經常會想到的就是 Object 類中就有的 equals() 方法,雖然許多類繼承并覆蓋了這個方法,但是大致上都差不多。因為Java中基本都是對象,所以都可以對其進行調用,一再強調null的類型(詳見第一條),something.equals(null),當something不是null時一切正常,可是如果是null的話,會拋出空指針異常,你要是不嫌麻煩,完全可以捕獲這個空指針異常,并直接做 null 處理,但是不建議。

?
1
2
3
4
5
6
7
8
public class ceshi{
    static String a=null;  
     public static void main(String args[]){
      if(a.equals(null)){
        System.out.println("==");
      }                                
   }
}

輸出結果

Exception in thread "main" java.lang.NullPointerException

at ceshi.main(ceshi.java:6)

 

2.5 靜態方法

你可能知道不能調用非靜態方法來使用一個值為 null 的引用類型變量。它將會拋出空指針異常,但是你可能不知道,你可以使用靜態方法來使用一個值為 null 的引用類型變量。因為靜態方法使用靜態綁定,不會拋出空指針異常。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ceshi{
  public static void main(String args[]){
      ceshi myObject = null;
      myObject.iAmStaticMethod();
      myObject.iAmNonStaticMethod();                            
   }
 
   private static void iAmStaticMethod(){
        System.out.println("I am static method, can be called by null reference");
   }
 
   private void iAmNonStaticMethod(){
       System.out.println("I am NON static method, don't date to call me by null");
   }
}

運行結果:

I am static method, can be called by null reference
Exception in thread "main" java.lang.NullPointerException
at ceshi.main(ceshi.java:6)

我們可以看到對象完全沒有實例化但是卻正常的執行了其靜態的方法,這其實也不奇怪,靜態方法完全可以使用類名直接使用,只不過繞了個彎,編譯器,所以不足為奇。

 

2.6 參數傳遞

我們可以將null傳遞給方法使用,這時方法可以接收任何引用類型,例如public void print(Object obj)可以這樣調用print(null)。從編譯角度來看這是可以的,但結果完全取決于方法。Null安全的方法,如在這個例子中的print方法,不會拋出空指針異常,只是優雅的退出。如果業務邏輯允許的話,推薦使用null安全的方法。

 

2.7 用途

  • 判斷一個引用類型數據是否null。 用==來判斷。
  • 釋放內存,讓一個非null的引用類型變量指向null。這樣這個對象就不再被任何對象應用了。等待JVM垃圾回收機制去回收。

 

三、SQL的NULL

在數據庫中NULL表示 未知的

NULL不等于零或空格,NULL 值不視作大于、小于或等于任何其它值。當一個變量、列或常量具有NULL值時,它的值是未知的、不確定的。“未知的”與空白或零或布爾值FALSE完全不同。“未知的”意味著該變量根本沒有值,因此不能與其他變量直接進行比較。判斷某列或者變量為 NULL 是只能用IS(NOT) NULL 去判斷他的返回值是 true 還是 false。

NULL參與排序時總是作為最小值存在,即ORDER BY COL ASC時COL為NULL的行在最前面,反之在最后面。

NULL值是未知的,且占用空間,不走索引,DBA建議建表的時候最好設置字段是NOT NULL 來避免這種低效率的事情的發生。

 

NULL值具有以下三個規則:

  • 一個NULL不與其他任何值相等;一個NULL不與其他任何值不等;
  • 在對一個NULL值應用函數時,一般都會得到一個NULL值作為結果。
  • 一般而言,只要執行涉及一個或多個NULL值的比較操作,那個比較的結果也是NULL值,它不同于TRUE或FALSE,因而這樣的比較除了失敗,沒有任何幫助作用。

 

注意空值與NULL之間的差異:

  • 在進行count()統計某列的記錄數的時候,如果采用的NULL值,會被系統自動忽略掉,但是空值是會進行統計到其中的。(count(*)會將NULL統計上)
  • 判斷NULL 用IS NULL 或者 IS NOT NULL,SQL 語句函數中可以使用 ifnull() 函數來進行處理,判斷空字符用 = 或者 <> 來進行處理。
  • 對于MySQL特殊的注意事項,對于timestamp數據類型,如果往這個數據類型插入的列插入NULL值,則出現的值是NULL。插入空值,則會出現 '0000-00-00 00:00:00'

 

三、Java與SQL

Java中的 null 只能賦值給各種引用類型,不能賦值給基本類型,然而SQL中的可以將NULL賦給任何數據類型,因此這就會導致異常的出現。

這樣一來,我們從數據庫中讀取字段的值后,在Java程序中如何判斷讀取的值是否為 null 呢?用 name==null 嗎?顯然不行,==是判斷兩個變量或實例是不是指向同一個內存空間,除非這個name是String類型的。而equals()方法呢?是判斷兩個變量或實例所指向的內存空間的值是不是相同。

java.sql.ResultSet接口中的boolean wasNull()方法可以解決這個問題:boolean wasNull();報告最后一個讀取的列是否具有值 SQL NULL。

注意,必須首先對列調用一個獲取方法嘗試讀取其值,然后調用wasNull ()方法查看讀取的值是否為 SQL NULL。如果發生數據庫訪問錯誤將拋出SQLException。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://fanxiaobin.blog.csdn.net/article/details/52817928

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 91一区二区三区久久久久国产乱 | 国产午夜精品一区 | 动漫孕妇被羞羞视频 | 欧美精品久久久久久久久老牛影院 | www.99热视频 | 中文字幕精品久久 | 精品在线免费播放 | 欧美亚洲黄色 | 永久av在线免费观看 | 色婷婷一区二区三区 | 日本综合久久 | 久久精品一区二区三 | 成人视屏在线 | 中文字幕电影免费播放 | 2018亚洲男人天堂 | 成人三级电影网站 | 免费看国产视频 | 久久精品视频7 | 黄a大片 | 久久国产成人午夜av浪潮 | xxxx69hd一hd72 | 特级黄毛片 | 久久久久久久久久一本门道91 | 凹凸成人精品亚洲精品密奴 | 欧美a在线 | 久久久电影电视剧免费看 | 免费一级欧美大片视频 | 色人阁五月天 | 国产视频在线观看免费 | 色屁屁xxxxⅹ在线视频 | 成人一级免费视频 | 国产一级一区 | 国产毛毛片一区二区三区四区 | www.777含羞草 | 一色桃子av大全在线播放 | 性大片性大片免费 | 欧美一级精品 | 99re热精品视频 | 国产一区不卡 | 欧美18一12sex性处hd | 久久国产精品电影 |