首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Web Servlet 字串陣列輸出亂碼:[Ljava.lang.String;@hash 解決方法

     編輯:程式設計綜合問答

Servlet 中 System.out.println(words) 輸出 [Ljava.lang.String;@11b886b7,因為 words 是陣列,直接列印會調用 Object.toString() 產生「類型@哈希碼」。

錯誤代碼片段

String[] words = { sb.toString() }; // ❌ 只有一個元素,且該元素是整個逗號分隔字串
// ...
for (int i = 0; i < words.length; i++) {
    if (words[i].startsWith(key)) { ... } // 實際只跑一次,邏輯錯誤
}
System.out.println(words); // 輸出陣列物件地址

根因

  • words 定義為 String[] 但只塞入一個長字串,非分割後的多個關鍵字。
  • 直接 println(陣列) 不會自動展開內容。

修正方案

// 1. 正確分割字串為陣列
String[] words = sb.toString().split(","); // 假設 sb 以逗號分隔

// 2. 正確列印陣列內容
System.out.println(Arrays.toString(words)); // [關鍵字1, 關鍵字2, ...]
// 或 Java 8+
Arrays.stream(words).forEach(System.out::println);

完整邏輯重構建議

protected void service(HttpServletRequest req, HttpServletResponse resp) {
    String key = req.getParameter("SearchText");
    if (key == null || key.isEmpty()) return;

    List<String> matched = new ArrayList<>();
    try (Connection conn = ConnDB.getConn();
         PreparedStatement ps = conn.prepareStatement("SELECT Names FROM info");
         ResultSet rs = ps.executeQuery()) {
        while (rs.next()) {
            String name = rs.getString("Names");
            if (name != null && name.startsWith(key)) {
                matched.add(name);
            }
        }
    } catch (SQLException e) { /* log & handle */ }

    // 直接序列化 List 為 JSON (需 Jackson/Gson)
    resp.setContentType("application/json;charset=UTF-8");
    new ObjectMapper().writeValue(resp.getWriter(), matched);
}

關鍵改進點

  • SQL 直接 WHERE Names LIKE 'key%' 下推過濾,減少網傳資料。
  • 使用 try-with-resources 自動關閉資源。
  • 返回標準 JSON 陣列,前端直接 JSON.parse。
  • 移除手動字串拼接 JSON,避免注入與格式錯誤。

核心:陣列列印用 Arrays.toString(),業務邏輯應在 SQL 層過濾,返回結構化資料而非手工拼字串。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved