当前位置:编程学习 > JAVA >>

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));
--------------------编程问答--------------------
引用 5 楼 Inhibitory 的回复:
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的值(这个不大可能吧)?或有其他什么想法?
引用 5 楼 Inhibitory 的回复:
String s1 = "abc";
String s2 = null;
System.out.println((s1 == null ? "" : s1) + (s2 == null ? "" : 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了。 --------------------编程问答--------------------
引用 11 楼 N27741 的回复:
本质上是 调用+运算时调用的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);
    }
}


万一,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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,