diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
index 8f08980aa..9b2bbb14a 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
@@ -128,7 +128,7 @@ public class ObjectUtil {
* 对象中是否包含元素
* 支持的对象类型包括:
*
- * - String
+ * - CharSequence
* - Collection
* - Map
* - Iterator
@@ -144,11 +144,22 @@ public class ObjectUtil {
if (obj == null) {
return false;
}
- if (obj instanceof String) {
- if (element == null) {
+ if (obj instanceof CharSequence) {
+ if (!(element instanceof CharSequence)) {
return false;
}
- return ((String) obj).contains(element.toString());
+ String elementStr;
+ try {
+ elementStr = element.toString();
+ // 检查 toString() 返回 null 的情况
+ if (elementStr == null) {
+ return false;
+ }
+ } catch (Exception e) {
+ // 如果toString抛异常,认为不包含
+ return false;
+ }
+ return obj.toString().contains(elementStr);
}
if (obj instanceof Collection) {
return ((Collection>) obj).contains(element);
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java
index 91a841887..efeb67f29 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java
@@ -135,4 +135,46 @@ public class ObjectUtilTest {
// 枚举已经无法使用
assertFalse(enumeration.hasMoreElements());
}
+
+ @Test
+ public void testContainsElementToStringReturnsNull() {
+ Object problematicElement = new Object() {
+ @Override
+ public String toString() {
+ return null; // 返回 null 的 toString
+ }
+ };
+ assertFalse(ObjectUtil.contains("test", problematicElement)); //不会抛异常
+ }
+
+ @Test
+ public void testContainsElementToStringInvalidSyntax() {
+ //字符串包含自定义User对象不符合语义
+ assertFalse(ObjectUtil.contains("User[id=123]", new User(123)));
+ }
+
+
+ static class User{
+ private int id;
+ public User(int id) {
+ this.id = id;
+ }
+ @Override
+ public String toString() {
+ return "User[" +
+ "id=" + id +
+ ']';
+ }
+ }
+
+ @Test
+ public void testContainsCharSequenceSupported() {
+ //contains方法支持String、StringBuilder、StringBuffer
+ StringBuilder stringBuilder = new StringBuilder("hello world");
+ StringBuffer stringBuffer = new StringBuffer("hello world");
+ String str = "hello world";
+ assertTrue((ObjectUtil.contains(stringBuilder, "world")));
+ assertTrue(ObjectUtil.contains(stringBuffer, "hello"));
+ assertTrue(ObjectUtil.contains(str, "hello"));
+ }
}