Make String.format("%s", arg) display null-valued arguments differently from "null"
Solution 1
With java 8 you can now use Optional class for this:
import static java.util.Optional.ofNullable;
...
String myString = null;
System.out.printf("myString: %s",
ofNullable(myString).orElse("Not found")
);
Solution 2
For a Java 7 solution that doesn't require external libraries:
String.format("this is %s", Objects.toString(this.someField, "?"));
Solution 3
The nicest solution, in my opinion, is using Guava's Objects method, firstNonNull. The following method will ensure you will print an empty string if someField is ever null.
String.format("this is %s", MoreObjects.firstNonNull(this.someField, ""));
Solution 4
A bit late on the subject, but this could be a quite clean-looking solution : First, create your own format method...
private static String NULL_STRING = "?";
private static String formatNull(String str, Object... args){
for(int i = 0; i < args.length; i++){
if(args[i] == null){
args[i] = NULL_STRING;
}
}
return String.format(str, args);
}
Then, use it as will...
@Test
public void TestNullFormat(){
Object ob1 = null;
Object ob2 = "a test";
String str = formatNull("this is %s", ob1);
assertEquals("this is ?", str);
str = formatNull("this is %s", ob2);
assertEquals("this is a test", str);
}
This eliminates the need for multiple, hard-to-read, ternary operators.
Solution 5
If you don't want to use replaceAll()
, You can assign a default text(String) for someField
.
But if some time this may assign null
again. So you can use validation for that case
this.someField == null ? "defaultText" : this.someField
Related videos on Youtube
Comments
-
VH-NZZ over 2 years
Consider the custom
toString()
implementation of a bean:@Override public String toString() { String.format("this is %s", this.someField); }
This yields
this is null
ifsomeField
is null.Is there a way to override the default
null
string representation of null-valued arguments to another text, i.e.,?
without calling explicitlyreplaceAll(...)
in thetoString
method?Note: The bean inherits from a superclass that could implement
Formattable
(http://docs.oracle.com/javase/7/docs/api/java/util/Formattable.html) but I just don't seem to understand how to make this work.EDIT: The snippet is over-simplified for the sake of example but I'm not looking for ternary operator solutions
someField==null ? "?" : someField
because:- there can be (potentially) a great many fields involved in
toString()
so checking all fields is too cumbersome and not fluent. - other people whom I have little control over (if any) are writing their own subclasses.
- if a method is called and returns null that would either imply calling the method twice or declaring a local variable.
Rather, can anything be done using the
Formattable
interface or having some customFormatter
(which isfinal
btw.)?-
Arnaud Denoyelle over 10 yearsI would do
String.format("this is %s", this.someField==null?"?":this.someField);
-
Arnaud Denoyelle over 10 yearsOr with Guava :
String.format("this is %s", Objects.firstNotNull(this.someField, "?"));
-
VH-NZZ over 10 yearsI always think fondly of
firstNotNull
, esp. similar implementations some SQL dialects, but Guava is too heavy a dependence and belongs more to the dependencies a Utils class than that of a pojo, imo. -
Kim Kern over 5 years@VH-NZZ There are some great solutions. Sure you can't choose one to accept?
-
VH-NZZ over 5 years@KimKern Most, if not all, somehow address the issue and ultimately produce a result compatible with the question, albeit at some expense. That being said, I objectively can't assert that I can pick one answer as truly superior, hence: no, at this stage I'm afraid I can't.
- there can be (potentially) a great many fields involved in
-
VH-NZZ over 10 yearsAgain, this is using the ternary operator. Thanks anyway.
-
VH-NZZ about 10 years... but implies a dependency on your
formatNull
method. -
JM Lord about 10 yearsOf course! Unless the case forementionned is specific to some output strategy class, where the method can be defined privately in the strategy itself. Then there would be no depenedency problem. If it is used at many places in the application, then yes it would need to be put in some library / util class.
-
dvtoever over 8 years
String.format("this is %s", StringUtils.defaultIfBlank(this.someField, ""));
will do the trick if Apache StringUtils happens to be on your classpath. -
burak over 3 yearsTo apply for also 'empty' values, it can be extended with 'filter(s -> !s.isEmpty())' as the following: System.out.printf("myString: %s", ofNullable(myString).filter(s -> !s.isEmpty()).orElse("Not found")