JAVA基础,如何得到我想要的输出
一个基础问题的深入讨论,见以下代码:String s1 = "abc";
String s2 = null;
System.out.println(s1 + s2);
以上代码会得到的结果是:abcnull,我希望得到abc,有没有办法。
个人希望能通过类似重载运算符的的方法解决,不希望改变太多现有代码,请教大虾,突然发现不能重载云算法,也无法继承StringBuffer重写append。
PS:什么通过非空判断、自己写function来实现字符串与的童鞋勿扰。 String --------------------编程问答-------------------- 你不希望改变太多代码。又想继承StringBuffer重写append。就算能继承,也得改代码呀 --------------------编程问答-------------------- String s2 = "";你试下 --------------------编程问答-------------------- 1. String在Java算是基础类型,无法被继承。如果你在考虑用反射,我觉得还是不要这样了。首先它对这个情况不会有帮助,其次它会破坏整个JDK以及其他依赖里面一切类的行为
2. Java没有运算符重载
3. 这么跟你说吧,你想做的这件事情,就跟让1+2 = 5一样。首先不可能,其次影响其他代码,因为这是一个基础操作,一动,整个程序就坏掉了
--------------------编程问答-------------------- String s1 = "abc";
String s2 = null;
System.out.println(s1 + s2);
如果这是一段java代码,那么输出的结果只能是abcnull,不管你用什么其它任何java支持的方法,都不能改变这个结果。除非改变java语言、JDK或者JVM。 --------------------编程问答-------------------- String s1 = "abc";
String s2 = null;
System.out.println((s1 == null ? "" : s1) + (s2 == null ? "" : s2));
--------------------编程问答--------------------
这算非空判断吧。。。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- System.out.println出来的就是String类的toString方法……
--------------------编程问答-------------------- 没啥意义 你自己封装个方法不就行了 --------------------编程问答-------------------- 楼主要想清楚自己的需求:
1、只有当s2==null时才输入“abc”,5楼答案是正解
2、还是忽略s2的值(这个不大可能吧)?或有其他什么想法?
--------------------编程问答-------------------- 本质上是 调用+运算时调用的String 的valueOf 静态函数
java这么写的,我也没办法重写 String的valueOf函数
只能重写PrintStream
//重写System.out.println的PrintStream
class MyPrintStream extends PrintStream
{
public MyPrintStream(PrintStream systemout) {
super(systemout);
}
@Override
public void print(String s)
{
s = s.replaceAll("null","");
super.print(s);
}
}
public class Test {
public static void main(String[] args) throws Exception{
String s = "abc";
String s2 = null;
System.out.println();
MyPrintStream myPrintStream = new MyPrintStream(System.out);
System.setOut(myPrintStream);
System.out.println(s2+s);
}
}
--------------------编程问答-------------------- 最简单的办法,是修改String 的valueOf 函数
源码如下:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
如果你修改的了,就吧 "null"换成 "" 就ok了。 --------------------编程问答--------------------
万一,s1="null"咋整。。 --------------------编程问答-------------------- 只能怪java的valueOf函数设计的太搞,如果是我,我一定会设计个接口
用于替换默认的 null 处理。
比如 setDefaultValueForNull 之类的函数,修改一个static成员
指定valueOf函数 碰到null Object的行为
再或者,干脆能重写valueOf
but,这是个static函数,如何重写?之所以是static ,无非是就要处理实例是null的情况。
--------------------编程问答-------------------- 谢谢这么多大侠回复,我其实问这个问题只是抛砖引玉,看看大家是否遇到过这个问题,怎么解决的。
上面的代码当然是个示例,实际需求我觉得各种时候都会遇到这种尴尬,遇到null时到底是业务数据还是空数据,得到该字符串时的业务流程中可能已经无从判断。
我的业务场景其实很简单,就是构建xml和解析xml。构建时不做足够的非空判断就会出现null数据。解析时就很纠结。现在只有行政上要求构建字符串时业务流程做足够的非空判断,但仍然理论上不存在。实际上有没有null、日后能不能保证不出现仍无从结论。
所以,如果有像C++重载运算符的方式,仍然不改变现有的字符串使用方法,对开发者相对透明我觉得解决问题是比较彻底的。而且我觉得是通用需求,如果是空指针我情愿要空值,要个null有毛用。
补充:Java , Java SE