StringSplit
String.split should never take only a single argument; it has surprising behavior

Severity
WARNING
Has Fix?
REQUIRES_HUMAN_ATTENTION

The problem

String.split(String) has surprising behaviour. For example, consider the following puzzler from http://konigsberg.blogspot.com/2009/11/final-thoughts-java-puzzler-splitting.html:

String[] nothing = "".split(":");
String[] bunchOfNothing = ":".split(":");

The result is [""] and []!

Prefer guava’s String.splitter, which has more predicitable behaviour and provides explicit control over the handling of empty strings and the trimming of whitespace.

Alternately, consider using String.split(String, int) and setting an explicit ‘limit’.

TIP: consider extracting the Splitter instance to a static final field.

Suppression

Suppress false positives by adding the suppression annotation @SuppressWarnings("StringSplit") to the enclosing element.


Positive examples

StringSplitPositiveCases.java

/*
* Copyright 2017 The Error Prone Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


package com.google.errorprone.bugpatterns.testdata;

/**
* Positive test cases for StringSplit check.
*
* @author dturner@twosigma.com (David Turner)
*/

public class StringSplitPositiveCases {

public void StringSplitOneArg() {
String foo = "a:b";
// BUG: Diagnostic contains: String.split
foo.split(":");
}
}

Negative examples

StringSplitNegativeCases.java

/*
* Copyright 2017 The Error Prone Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


package com.google.errorprone.bugpatterns.testdata;

/**
* Negative test cases for StringSplit check.
*
* @author dturner@twosigma.com (David Turner)
*/

public class StringSplitNegativeCases {
public void StringSplitTwoArgs() {
String foo = "a:b";
foo.split(":", 1);
}

public void StringSplitTwoArgsOneNegative() {
String foo = "a:b";
foo.split(":", -1);
}
}