java.lang.ClassCastException你是怎麼處理的?

事件原由

在作一個類型轉換時遇到了下面的異常:java

ClassCastException
ClassCastException

是說不能把 Integer 類型強制轉換成 String 類型。git

個人測試代碼大概是這個樣子:github

public static void testClassCastException() {
 Integer i1 = Integer.valueOf(getT()); // ① 拋異常  Integer i2 = (Integer) getT(); // ② 正常  Integer i3 = Integer.valueOf(getT().toString()); // ③ 正常 }  private static <T> T getT() {  return (T) new Integer(10); }  // ①和③的不一樣在於Integer.valueOf()裏的參數的類型,其實Integer.valueOf()方法就是須要String類型的,因此咱們直接用Integer類型固然在底層是不識別的。 // ①和②的不一樣在於類型轉換的方式,這個就引伸出下面這個問題了。 複製代碼

(String)、toString、String.valueOf 的區別

  1. toString() toString()是在 Object 中定義的,所以,任何繼承 Object 的類都具備這個方法。

​ 在 API 中 toString()被描述爲:spring

​ 返回該對象的字符串表示。一般,toString 方法會返回一個「以文本方式表示」此對象的字符串。結果應是一個簡明但易於讀懂的信息表達式。建議全部子類都重寫此方法。安全

Object 類的 toString 方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、標記符「@」和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等於:getClass().getName()+'@'+Integer.toHexString(hashCode())   咱們在定義一個類的時候能夠重寫繼承自 Object 的 toString()方法,以此來表示該對象的基本信息。   可是,使用 toString()的對象不能爲 null,不然會拋出異常 java.lang.NullPointerException。markdown

  1. String.valueOf() String.valueOf()解決了 toString()使用對象不能爲空的問題,實際上,該方法在底層仍是使用了 toString()。以下源碼:
public static String valueOf(Object obj) {
 return (obj == null) ? "null" : obj.toString(); } 複製代碼

值得注意的是,若是使用對象爲 null,返回的結果是字符串」null」,而不是對象 null。   在不少時候使用 String.valueOf()比使用 toString()更能減小報錯的機會,由於不用考慮是否爲 null 的狀況。可是,也要特別注意:if(String.valueOf(o) == null){...}這樣的代碼確定就回有問題,由於永遠不會獲得執行。oop

  1. (String) (String)區別於上面兩種方法,由於它是強制轉換。 每一個對象在建立的時候就已經肯定了類型不能改變,所謂的強制轉換隻是表面上將其轉換成了另外一種類型,就至關於 A 被當成了 B 使用,若是 A 可以被當成 B,那一切沒有問題,可是 A 作不了 B,就只能拋出異常,說我作不到。
Integer o = new Integer(100);
System.out.println((String)o); 複製代碼

如上代碼編譯時就會報錯:Cannot cast Integer to String,說明 Integer 不能經過強制轉換成 String。   而咱們一開始的代碼:測試

Object x = new Integer(0);
System.out.println((String)x); 複製代碼

​ 在編譯時沒錯,運行時拋出異常。這是由於 x 在表面上是 Object,其實是 Integer。而 Object 是能夠經過強制轉換成爲 String 的。因此,在編譯的時候,x 被當成了 Object,你們相安無事,真正運行的時候,x 被查出來是 Integer,理所固然就拋出了 ClassCastException。spa

最安全的方法:instanceof

取到的對象進行類型轉換若是不知道具體會是什麼類型的,能夠經過instanceof關鍵字來檢查改對象屬於哪一個類型的,再具體去進行某些業務。.net

PS:a instanceof b的結果和b.class.isInstance(a)的結果是一致的,能夠實現相同的功能,徹底等價。

爲何在 Java 裏不能將 Integer 強制轉換成 String

由於 StringInteger 不是在同一個對象階層。

Object
     /      \
    /        \
String     Integer
複製代碼

當你嘗試強制轉換時,僅僅會在同一個對象階層轉換。好比:

Object
     /
    /
   A
  /
/
B
複製代碼

在這種狀況,(A)objB 或者 (Object)objB 或者 (Object)objA 能夠進行轉換。

正如其餘人已經提到,將integer轉換成String可使用如下方法:

基本類型的整型時使用:String.valueOf(integer)或者Integer.toString(integer) 來轉換成StringInteger對象型時使用:Integer.toString()轉換成String

參考:

翻譯|爲何在 Java 裏不能將 Integer 強制轉換成 String | PostgreSQL DBA

java.toString() ,(String),String.valueOf 的區別 _java_springk 的專欄-CSDN 博客


求關注、分享、在看!!! 你的支持是我創做最大的動力。

本文使用 mdnice 排版

相關文章
相關標籤/搜索