Як я можу перевірити, чи рядок не є нульовим та не порожнім?
public void doStuff(String str)
{
if (str != null && str != "**here I want to check the 'str' is empty or not**")
{
/* handle empty string */
}
/* ... */
}
Як я можу перевірити, чи рядок не є нульовим та не порожнім?
public void doStuff(String str)
{
if (str != null && str != "**here I want to check the 'str' is empty or not**")
{
/* handle empty string */
}
/* ... */
}
Відповіді:
Що щодо isEmpty () ?
if(str != null && !str.isEmpty())
Обов’язково використовуйте частини &&
цього порядку, тому що java не буде переходити до оцінки другої частини, якщо перша частина &&
не вдасться, таким чином гарантуючи, що ви не отримаєте нульове виключення вказівника з, str.isEmpty()
якщо str
є null.
Обережно, він доступний лише з Java SE 1.6. Ви повинні перевірити str.length() == 0
попередні версії.
Щоб ігнорувати пробіли:
if(str != null && !str.trim().isEmpty())
(оскільки Java 11 str.trim().isEmpty()
можна зменшити, до str.isBlank()
чого також буде перевірено інші пробіли Unicode)
Згорнутий у зручну функцію:
public static boolean empty( final String s ) {
// Null-safe, short-circuit evaluation.
return s == null || s.trim().isEmpty();
}
Стає:
if( !empty( str ) )
isEmpty()
здається, потрібен екземпляр String (нестатичний). Викликання цього на нульове посилання призведе до виведення NullPointerException.
TextUtils.isEmpty(String)
для перевірки, чи є рядок порожнім або нульовим. Приємний і короткий. Клас TextUtils є частиною Android SDK.
(str != null && str.length() > 0)
.
Мені подобається використовувати Apache commons-lang для таких речей, і особливо класу утиліти StringUtils :
import org.apache.commons.lang.StringUtils;
if (StringUtils.isNotBlank(str)) {
...
}
if (StringUtils.isBlank(str)) {
...
}
isEmpty
або isBlank
, можливо, не корисно включати сторонні бібліотеки. Ви можете просто створити свій власний клас корисності для надання такого способу. Однак, як пояснює Божо, commons-lang
проект надає багато корисних методів!
StringUtils.isNotBlank(str)
робить і перевірку нуля.
Щоб додати до @BJorn та @SeanPatrickFloyd Спосіб Guava це:
Strings.nullToEmpty(str).isEmpty();
// or
Strings.isNullOrEmpty(str);
Commons Lang часом легше читається, але я повільно більше покладаюсь на Гуаву плюс іноді Commons Lang є заплутаною, коли мова йде про isBlank()
(як у білому просторі чи ні).
Версія Commons Lang від Guava була isBlank
б такою:
Strings.nullToEmpty(str).trim().isEmpty()
Я скажу код, який не дозволяє ""
(порожній) І null
є підозрілим і потенційно баггі в тому, що він, ймовірно, не обробляє всі випадки, коли заборона не null
має сенсу (хоча для SQL я розумію, як SQL / HQL дивно ''
).
str != null && str.length() != 0
альтернативно
str != null && !str.equals("")
або
str != null && !"".equals(str)
Примітка: Друга перевірка (перша та друга альтернативи) передбачає, що str не є нульовим. Це нормально лише тому, що це робить перша перевірка (а Java не робить другу перевірку, якщо перша помилкова)!
ВАЖЛИВО: НЕ використовуйте == для рівності рядків. == перевіряє, що покажчик дорівнює, а не значення. Два рядки можуть бути в різних адресах пам'яті (два екземпляри), але мати однакове значення!
Майже кожна бібліотека, яку я знаю, визначає клас утиліти, який називається StringUtils
, StringUtil
або StringHelper
, і вони зазвичай включають метод, який ви шукаєте.
Мій особистий фаворит - Apache Commons / Lang , де в класі StringUtils ви отримуєте обидва
(Перший перевіряє, чи є рядок нульовим чи порожнім, другий перевіряє, чи є нульовим, порожнім чи лише пробілом)
Існують подібні класи корисних програм у Spring, Wicket та багато інших ліб. Якщо ви не використовуєте зовнішні бібліотеки, можливо, ви захочете ввести клас StringUtils у свій власний проект.
Минуло багато років, і в ці дні я б рекомендував використовувати: Update Guava «s Strings.isNullOrEmpty(string)
метод.
Це працює для мене:
import com.google.common.base.Strings;
if (!Strings.isNullOrEmpty(myString)) {
return myString;
}
Повертає true, якщо вказаний рядок є нульовим або порожній рядок.
Подумайте про нормалізацію посилань на рядок за допомогою nullToEmpty. У цьому випадку ви можете використовувати String.isEmpty () замість цього методу, і вам не знадобляться спеціальні безпечні форми таких методів, як String.toUpperCase. Або, якщо ви хочете нормалізувати "в інший бік", перетворюючи порожні рядки в нульові, ви можете використовувати emptyToNull.
Як щодо:
if(str!= null && str.length() != 0 )
&&
if str == null, тим самим запобігаючи NullPointerException. (Джерело: Я щойно спробував)
Використовуйте такий метод isNotBlank Apache StringUtils, як
StringUtils.isNotBlank(str)
Він повернеться істинним, лише якщо str не є нульовим та не порожнім.
Ви повинні використовувати org.apache.commons.lang3.StringUtils.isNotBlank()
абоorg.apache.commons.lang3.StringUtils.isNotEmpty
. Рішення між цими двома ґрунтується на тому, що ви насправді хочете перевірити.
У isNotBlank () перевіряє , що вхідний параметр є:
IsNotEmpty () перевіряє тільки те , що вхідний параметр є
Повертає значення true чи false на основі введених даних
Predicate<String> p = (s)-> ( s != null && !s.isEmpty());
p.test(string);
Якщо ви не хочете включати всю бібліотеку; просто включіть з нього потрібний код. Вам доведеться підтримувати це самостійно; але це досить пряма функція вперед. Ось це скопійовано з commons.apache.org
/**
* <p>Checks if a String is whitespace, empty ("") or null.</p>
*
* <pre>
* StringUtils.isBlank(null) = true
* StringUtils.isBlank("") = true
* StringUtils.isBlank(" ") = true
* StringUtils.isBlank("bob") = false
* StringUtils.isBlank(" bob ") = false
* </pre>
*
* @param str the String to check, may be null
* @return <code>true</code> if the String is null, empty or whitespace
* @since 2.0
*/
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
Трохи пізно, але ось функціональний стиль перевірки:
Optional.ofNullable(str)
.filter(s -> !(s.trim().isEmpty()))
.ifPresent(result -> {
// your query setup goes here
});
Існує новий метод в java-11: String#isBlank
Повертає true, якщо рядок порожній або містить лише кодові точки білого пробілу, інакше false.
jshell> "".isBlank()
$7 ==> true
jshell> " ".isBlank()
$8 ==> true
jshell> " ! ".isBlank()
$9 ==> false
Це може бути поєднано з тим, Optional
щоб перевірити, чи рядок є нульовим чи порожнім
boolean isNullOrEmpty = Optional.ofNullable(str).map(String::isBlank).orElse(true);
тест дорівнює порожньому рядку і нулю в тому ж умовному:
if(!"".equals(str) && str != null) {
// do stuff.
}
Не кидає, NullPointerException
якщо str нульовий, оскільки Object.equals()
повертає false, якщо arg null
.
інша конструкція str.equals("")
кинула б то боязнь NullPointerException
. Деякі можуть вважати погану форму, використовуючи лінійку String як об'єкт, на equals()
який викликається, але це робить роботу.
Також перевірте цю відповідь: https://stackoverflow.com/a/531825/1532705
str != null
. !"".equals(str)
вже робіть роботу
Як сказав Seanizer вище, Apache StringUtils є фантастичним для цього, якщо ви включили гуаву, вам слід зробити наступне;
public List<Employee> findEmployees(String str, int dep) {
Preconditions.checkState(StringUtils.isNotBlank(str), "Invalid input, input is blank or null");
/** code here **/
}
Можна також рекомендувати вам звертатися до стовпців у вашому результаті, встановлених по імені, а не по індексу, це полегшить ваш код у підтримці.
Я зробив власну функцію утиліти, щоб перевірити відразу декілька рядків, а не мати виписку if if(str != null && !str.isEmpty && str2 != null && !str2.isEmpty)
. Це функція:
public class StringUtils{
public static boolean areSet(String... strings)
{
for(String s : strings)
if(s == null || s.isEmpty)
return false;
return true;
}
}
тому я можу просто написати:
if(!StringUtils.areSet(firstName,lastName,address)
{
//do something
}
areSet(String... strings)
тоді можна викликати без створення масиву:if(!StringUtils.areSet(firstName, lastName, address))
Якщо ви використовуєте Java 8 і хочете скористатися більш функціональним підходом до програмування, ви можете визначити, Function
що керує елементом управління, а потім ви можете використовувати його повторно та apply()
коли це буде потрібно.
Прийшовши на практику, ви можете визначити Function
як
Function<String, Boolean> isNotEmpty = s -> s != null && !"".equals(s)
Потім ви можете використовувати його, просто зателефонувавши apply()
методу як:
String emptyString = "";
isNotEmpty.apply(emptyString); // this will return false
String notEmptyString = "StackOverflow";
isNotEmpty.apply(notEmptyString); // this will return true
Якщо ви віддаєте перевагу, ви можете визначити, Function
що перевіряє, чи String
є порожнім, а потім заперечувати його !
.
У цьому випадку Function
заповіт виглядатиме так:
Function<String, Boolean> isEmpty = s -> s == null || "".equals(s)
Потім ви можете використовувати його, просто зателефонувавши apply()
методу як:
String emptyString = "";
!isEmpty.apply(emptyString); // this will return false
String notEmptyString = "StackOverflow";
!isEmpty.apply(notEmptyString); // this will return true
З додатком Java 8 ви можете:
public Boolean isStringCorrect(String str) {
return Optional.ofNullable(str)
.map(String::trim)
.map(string -> !str.isEmpty())
.orElse(false);
}
У цьому виразі ви будете обробляти String
s, які також складаються з пробілів.
Ви можете використовувати StringUtils.isEmpty (), це призведе до істини, якщо рядок є нульовою або порожньою.
String str1 = "";
String str2 = null;
if(StringUtils.isEmpty(str)){
System.out.println("str1 is null or empty");
}
if(StringUtils.isEmpty(str2)){
System.out.println("str2 is null or empty");
}
призведе до
str1 є нульовим або порожнім
str2 є нульовим або порожнім
isNotBlank
Я б порадив Guava або Apache Commons відповідно до вашої реальної потреби. Перевірте різні типи поведінки в моєму прикладі коду:
import com.google.common.base.Strings;
import org.apache.commons.lang.StringUtils;
/**
* Created by hu0983 on 2016.01.13..
*/
public class StringNotEmptyTesting {
public static void main(String[] args){
String a = " ";
String b = "";
String c=null;
System.out.println("Apache:");
if(!StringUtils.isNotBlank(a)){
System.out.println(" a is blank");
}
if(!StringUtils.isNotBlank(b)){
System.out.println(" b is blank");
}
if(!StringUtils.isNotBlank(c)){
System.out.println(" c is blank");
}
System.out.println("Google:");
if(Strings.isNullOrEmpty(Strings.emptyToNull(a))){
System.out.println(" a is NullOrEmpty");
}
if(Strings.isNullOrEmpty(b)){
System.out.println(" b is NullOrEmpty");
}
if(Strings.isNullOrEmpty(c)){
System.out.println(" c is NullOrEmpty");
}
}
}
Результат:
Apache:
a пустий
b порожній
c порожній
Google:
b є NullOrEmpty
c є NullOrEmpty
Для повноти: Якщо ви вже використовуєте рамку Spring , метод StringUtils надає метод
org.springframework.util.StringUtils.hasLength(String str)
Повертає: true, якщо String не є нульовим і має довжину
а також метод
org.springframework.util.StringUtils.hasText(String str)
Повертає: true, якщо рядок не є нульовим, його довжина перевищує 0, і вона не містить лише пробілів
Просто, щоб ігнорувати пробіл:
if (str == null || str.trim().length() == 0) {
// str is empty
} else {
// str is not empty
}
Якщо ви використовуєте Spring Framework, тоді ви можете використовувати метод:
org.springframework.util.StringUtils.isEmpty(@Nullable Object str);
Цей метод приймає будь-який Об'єкт як аргумент, порівнюючи його з нулем і порожнім рядком. Як наслідок, цей метод ніколи не поверне істину для ненульового нестрокового об'єкта.
StringUtils
прямо вказано "В основному для внутрішнього використання в рамках; розгляньте Apache's Commons Lang для більш всебічного набору String утиліт".
Кращий спосіб обробити нульовий рядок -
str!=null && !str.equalsIgnoreCase("null") && !str.isEmpty()
Коротко,
str.length()>0 && !str.equalsIgnoreCase("null")
Щоб перевірити, чи всі атрибути рядка в об’єкті порожні (Замість того, щоб використовувати! = Null для всіх імен полів після підходу api-відображення Java-відображення
private String name1;
private String name2;
private String name3;
public boolean isEmpty() {
for (Field field : this.getClass().getDeclaredFields()) {
try {
field.setAccessible(true);
if (field.get(this) != null) {
return false;
}
} catch (Exception e) {
System.out.println("Exception occurred in processing");
}
}
return true;
}
Цей метод повертає true, якщо всі значення поля String порожні, він поверне помилковим, якщо в атрибутах String є одне значення
Я зіткнувся з ситуацією, коли я повинен перевірити, що "null" (як рядок) слід вважати порожнім. Також пробіл та фактична нуль повинні повернути істину. Я нарешті зупинився на наступній функції ...
public boolean isEmpty(String testString) {
return ((null==testString) || "".equals((""+testString).trim()) || "null".equals((""+testString).toLowerCase()));
}
Якщо вам потрібно перевірити параметри методу, ви можете скористатися простим методом
public class StringUtils {
static boolean anyEmptyString(String ... strings) {
return Stream.of(strings).anyMatch(s -> s == null || s.isEmpty());
}
}
Приклад:
public String concatenate(String firstName, String lastName) {
if(StringUtils.anyBlankString(firstName, lastName)) {
throw new IllegalArgumentException("Empty field found");
}
return firstName + " " + lastName;
}
PreparedStatement
таку, а не побудову SQL-запиту за допомогою рядкових примітивів конкатенації. Уникає всі види вразливостей для ін'єкцій, набагато більш зручним для читання і т.д.