String.valueOf()方法的使用总结

以下内容转自链接:https://www.jianshu.com/p/6f6932717a27

String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 
也就是 String.valueOf() 这个参数多载的方法 
有下列几种 
String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 
String.valueOf(char c) : 将 char 变量 c 转换成字符串 
String.valueOf(char[] data) : 将 char 数组 data 转换成字符串 
String.valueOf(char[] data, int offset, int count) : 
将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串 
String.valueOf(double d) : 将 double 变量 d 转换成字符串 
String.valueOf(float f) : 将 float 变量 f 转换成字符串 
String.valueOf(int i) : 将 int 变量 i 转换成字符串 
String.valueOf(long l) : 将 long 变量 l 转换成字符串 
String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString() 
用法如: 
int i = 10; 
String str = String.valueOf(i); 
这时候 str 就会是 "10" 

 

要将 String 转换成基本数据型态
大多需要使用基本数据型态的包装类别 
比如说 String 转换成 byte 
可以使用 Byte.parseByte(String s) 
这一类的方法如果无法将 s 分析 则会丢出 NumberFormatException 异常
byte : 
Byte.parseByte(String s) : 将 s 转换成 byte 
Byte.parseByte(String s, int radix) : 以 radix 为基底 将 s 转换为 byte 
比如说 Byte.parseByte("11", 16) 会得到 17 
double : 
Double.parseDouble(String s) : 将 s 转换成 double 
float : 
Double.parseFloat(String s) : 将 s 转换成 float 
int : 
Integer.parseInt(String s) : 将 s 转换成 int 
long : 
Long.parseLong(String s); 将s转换成long
<think>我们正在讨论`String.valueOf(null)`的返回结果。根据引用[3]和引用[4],我们知道`String.valueOf`有多个重载方法,其中一个接受`Object`参数,另一个接受`char[]`参数。当传入`null`时,编译器需要确定调用哪个重载方法。 引用[4]提到:`String.valueOf(null)`会导致歧义,因为有两个重载方法可以接受`null`: - `String.valueOf(char[] data)` - `String.valueOf(Object obj)` 在Java中,`null`可以赋值给任何引用类型,因此这两个方法都是可行的。编译器会选择最具体的方法。根据Java的重载解析规则,`char[]`比`Object`更具体(因为`char[]`是`Object`的子类),所以编译器会选择`String.valueOf(char[] data)`。 但是,当我们调用`String.valueOf(null)`时,实际上传入的是一个`char[]`类型的`null`。然而,在方法内部,它会尝试访问这个数组(比如获取长度或内容),从而抛出`NullPointerException`。 引用[1]和引用[3]都提到:`String.valueOf(null)`会报空指针异常(NPE)。引用[1]明确指出:“调用String.valueOf()时若实参直接写为 null,方法会报 NPE”。引用[3]也提到:“null调用toString(),会报错”,但是这里要注意,如果走的是`valueOf(Object obj)`,则不会报错,而是返回字符串"null"。然而,当直接传入`null`字面量时,编译器会选择`valueOf(char[])`,从而抛出异常。 因此,`String.valueOf(null)`的返回结果并不是一个字符串,而是会抛出`NullPointerException`。 验证: ```java public class Main { public static void main(String[] args) { // 以下代码会抛出NullPointerException String result = String.valueOf(null); System.out.println(result); } } ``` 原因: 在运行时,由于实际传入的是`null`(表示一个空引用),而方法期望一个非空的`char[]`数组,当方法内部尝试操作这个数组(例如,获取数组长度)时,就会抛出`NullPointerException`。 总结: - 当直接使用`String.valueOf(null)`时,编译器会选择重载方法`valueOf(char[] data)`,因为`char[]`比`Object`更具体。 - 但是传入的`null`表示一个空的`char[]`引用,因此当方法内部尝试访问这个数组时,就会抛出`NullPointerException`。 如果希望返回字符串"null",应该显式指定为`Object`类型,例如: ```java Object obj = null; String s = String.valueOf(obj); // 返回"null" ``` 引用[5]中也提到了类似的处理方案:使用三元运算符显式处理null以避免问题。 因此,直接调用`String.valueOf(null)`的结果是抛出`NullPointerException`,而不是返回字符串"null"。 </think>### String.valueOf(null) 的返回结果分析 根据提供的引用资料,`String.valueOf(null)` **会抛出 NullPointerException (NPE) 异常**,而不是返回字符串。以下是详细分析: #### 1. **方法重载问题** Java 的 `String.valueOf()` 方法有多个重载版本(引用[2]): ```java String.valueOf(char[] data); String.valueOf(Object obj); ``` 当传入 `null` 时: - 编译器无法确定 `null` 应匹配 `char[]` 还是 `Object` 版本 - 根据 Java 重载解析规则,优先选择更具体的类型 `char[]` - 最终调用 `String.valueOf(char[] data)` 方法 #### 2. **NPE 异常原因** - `String.valueOf(char[] data)` 方法内部需要操作数组(引用[3][4]) - 当传入 `null`(空指针)时,JVM 尝试访问数组长度属性 - 导致抛出 `NullPointerException` 示例错误信息: ``` Exception in thread "main" java.lang.NullPointerException at java.lang.String.valueOf(String.java:3337) ``` #### 3. **对比其他情况** | 调用方式 | 结果 | 原因说明 | |---------------------------|------------------|------------------------------| | `String.valueOf((Object)null)` | 返回 `"null"` | 明确调用 Object 版本 [^4] | | `String.valueOf(null)` | **抛出 NPE** | 编译器选择 char[] 版本 [^1] | | `obj.toString()` | 抛出 NPE | 直接调用空对象方法 [^3] | #### 4. **解决方案** 需要处理 `null` 时: 1. **显式类型转换** ```java String safeValue = String.valueOf((Object)null); // 返回 "null" ``` 2. **三元运算符处理** ```java String result = obj == null ? "" : String.valueOf(obj); // 返回空字符串 [^5] ``` > **关键结论**:`String.valueOf(null)` 会抛出 NPE,因为编译器优先选择 `char[]` 重载方法,而该方法无法处理 `null` 参数 [^1][^3]。 *** ### 相关问题 1. 为什么 `String.valueOf((Object)null)` 不报错而 `String.valueOf(null)` 会报错? 2. Java 中处理 `null` 转换成字符串的最佳实践有哪些? 3. 如何避免 `String.valueOf()` 方法返回 `"null"` 字符串造成的逻辑错误? 4. Java 方法重载时编译器如何选择具体实现? [^1]: 引用[1] [^2]: 引用[2] [^3]: 引用[3] [^4]: 引用[4] [^5]: 引用[5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值