Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Я предложил бы что-то как:-
bool nonEmptyDataSet = dataSet != null &&
(from DataTable t in dataSet.Tables where t.Rows.Count > 0 select t).Any();
Редактирования: Я значительно очистил код после должного внимания, я думаю, что это намного более чисто. Большое спасибо Keith для вдохновения относительно использования.Any ().
В соответствии с предложением Keith, вот дополнительная версия метода этого подхода:-
public static class ExtensionMethods {
public static bool IsEmpty(this DataSet dataSet) {
return dataSet == null ||
!(from DataTable t in dataSet.Tables where t.Rows.Count > 0 select t).Any();
}
}
Отметьте, поскольку Keith справедливо исправил меня на в комментариях его сообщения, этот метод будет работать, даже когда набор данных является пустым.
Что случилось с
(aDataSet. Таблицы. Количество == 0)
?
Я думаю, что это - место, где Вы могли использовать дополнительный метод в C# 3 для улучшения четкости.
Используя идею kronoz...
public static bool IsNotEmpty ( this dataset )
{
return dataSet != null && (
from DataTable t in dataSet.Tables
where t.Rows.AsQueryable().Any()
select t).AsQueryable().Any();
}
//then the check would be
DataSet ds = /* get data */;
ds.IsNotEmpty();
Вследствие того, что дополнительные методы всегда расширяются компилятором, это будет даже работать, если проверяемый набор данных будет пустым.
Во время компиляции это изменяется:
ds.IsNotEmpty();
//becomes
DataSetExtensions.IsNotEmpty( ds );
Чтобы быть ясными, необходимо было бы сначала посмотреть на весь DataTables и затем посмотреть на количество строк для каждого DataTable.
Я создал маленький статический util класс просто с этой целью
Ниже кода должен читать как английское предложение.
public static bool DataSetIsEmpty(DataSet ds)
{
return !DataTableExists(ds) && !DataRowExists(ds.Tables[0].Rows);
}
public static bool DataTableExists(DataSet ds)
{
return ds.Tables != null && ds.Tables.Count > 0;
}
public static bool DataRowExists(DataRowCollection rows)
{
return rows != null && rows.Count > 0;
}
Я просто поместил бы что-то как ниже кода и был бы сделан с ним. Написание читаемого кода проводит подсчет.
if (DataAccessUtil.DataSetIsEmpty(ds)) {
return null;
}