Java中如何避免控制台打印错误及正确输出数据库查询数据
关于Java控制台错误打印优化与JDBC数据格式化输出的解决方案
嘿,我来帮你搞定这两个问题——避免控制台乱输出错误信息,还有把数据库查出来的数据打印得整整齐齐的,顺便给你优化那段JDBC代码~
一、如何避免控制台打印不必要的错误?
控制台乱喷错误大多是因为未处理的异常或者不规范的错误输出,咱可以从这几点入手:
- 捕获异常并按需处理:别让未捕获的Exception直接把堆栈信息全怼到控制台。用
try-catch包裹可能出错的代码块,在catch里只输出必要的信息,比如友好的错误提示,而不是全量的堆栈跟踪(开发环境可以保留堆栈方便调试,生产环境一定要关掉)。 - 用日志框架替代
System.err:别直接用System.err.println()打错误,换成SLF4J+Logback这类专业日志框架。你可以配置日志级别(比如生产环境只打ERROR级别的日志),还能把日志输出到文件而不是控制台,避免敏感信息泄露,格式也更规范。 - 提前做参数校验:比如数据库连接URL、用户名密码先检查是否为空,SQL语句先做语法校验,从源头减少因参数错误导致的异常输出。
二、正确打印数据库数据(优化你的JDBC代码)
你原来的代码主要问题是用空格手动对齐,遇到长度不同的字符串就会乱掉,而且没正确关闭JDBC资源,容易造成连接泄漏。咱直接上优化后的代码,再给你拆解关键点:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class StudentDataPrinter { public static void main(String[] args) { // 数据库连接配置 String dbUrl = "jdbc:mysql://localhost/test"; String dbUser = "root"; String dbPassword = "****"; // 建议明确指定查询列,不要用SELECT *,避免列顺序变化或冗余数据 String querySql = "SELECT id, name, class, age FROM student_table"; // 使用try-with-resources自动关闭资源(Java 7+支持),无需手动写finally try (Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword); Statement stmt = conn.createStatement(); ResultSet resultSet = stmt.executeQuery(querySql)) { // 用printf格式化表头,指定列宽并左对齐,保证列对齐 System.out.printf("%-5s %-10s %-15s %-5s%n", "id", "name", "class", "age"); System.out.println("---------------------------------------------"); // 加个分隔线更清晰 // 遍历结果集,同样用printf格式化每一行数据 while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); // 注意:class是SQL关键字,建议数据库列名别用,这里暂时直接取 String className = resultSet.getString("class"); int age = resultSet.getInt("age"); // 按指定宽度格式化输出,左对齐保证列整齐 System.out.printf("%-5d %-10s %-15s %-5d%n", id, name, className, age); } } catch (Exception e) { // 生产环境建议用日志框架记录,比如log.error("查询学生数据失败", e); // 控制台输出只保留关键错误信息,避免冗余堆栈 System.err.println("查询数据库时出错:" + e.getMessage()); // 开发环境可以打开下面这行看堆栈,生产环境注释掉 // e.printStackTrace(); } } }
优化关键点解释:
- try-with-resources自动关资源:JDBC的
Connection、Statement、ResultSet都实现了AutoCloseable接口,用try-with-resources包裹后,代码块结束会自动关闭这些资源,避免手动关闭时遗漏导致的连接泄漏。 - printf格式化输出:
%-5s表示左对齐、占5个字符宽度,不管内容长短,每列都会对齐,彻底解决你原来的格式混乱问题。 - 明确查询列:别用
SELECT *,一是减少不必要的数据传输,二是避免数据库表结构变化后,结果集列顺序变化导致的取值错误。 - 规范异常处理:只输出错误信息的核心内容,堆栈信息只在开发环境保留,生产环境换成日志记录,避免控制台输出敏感信息。
内容的提问来源于stack exchange,提问作者Klayd Pro
相关产品推荐
相关产品推荐

