You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian 10命令行运行带postgresql外部jar的Java程序异常求助

问题原因

  1. 类路径配置错误:你当前工作目录已经是~/Music,依赖包和编译后的class文件都直接存放在该目录下,运行命令中写Music/postgresql-42.2.23.jar会尝试寻找~/Music/Music/postgresql-42.2.23.jar路径,实际不存在该路径,导致JDBC驱动加载失败。
  2. 异常被静默吞掉:代码中的catch块为空,所有运行时异常(包括数据库连接失败、表已存在报错、端口占用报错等)都不会输出日志,看起来就像程序无任何响应。
  3. 代码逻辑本身存在阻塞点:ServerSocket.accept()是阻塞方法,在没有客户端连接4000端口的情况下,程序会一直卡在该步骤,不会执行后续打印逻辑。
  4. 数据库连接串不完整:PostgreSQL JDBC连接串需要明确指定目标数据库名,你写的jdbc:postgresql://localhost/缺少库名,会导致连接失败。
  5. 建表逻辑兼容差:如果jason表已经存在,直接执行CREATE TABLE会抛出异常,直接进入空catch块。
  6. 第一条运行命令格式错误:java -cp .:Music/postgresql-42.2.23.jar:serverinsert把主类名放到了classpath参数中,系统找不到主类所以直接报错。

解决步骤

第一步:修改Java代码

调整后的代码核心修改点如下:

import java.sql.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class serverinsert {
    public static void main(String []V){
        Connection c = null;
        Statement stmt = null;
        try
        {
            //连接本地数据库
            Class.forName("org.postgresql.Driver");
            // 补全你的目标数据库名,这里以dbname为例,替换为实际库名
            c = DriverManager
                    .getConnection("jdbc:postgresql://localhost:5432/dbname",
                            "postgres", "gflow123");
            System.out.println("Opened database successfully");

            //本地建表
            stmt = c.createStatement();
            // 增加IF NOT EXISTS避免表已存在报错
            String sql = "CREATE TABLE IF NOT EXISTS jason " +
                    "(ID INT      NOT NULL," +
                    " sendata json NOT NULL)";
            stmt.executeUpdate(sql); 
            System.out.println("Table created successfully");

            //开启DLC客户端连接监听
            ServerSocket ss = new ServerSocket(4000);
            // 增加启动提示,确认程序正常运行到监听端口步骤
            System.out.println("服务端已启动,等待客户端连接4000端口...");
            Socket s = ss.accept();
            System.out.println("客户端已连接");
            StringBuilder sb = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String line;

            // 读取DLC数据存入content变量
            String content="";
            while((line = br.readLine()) != null){
                sb.append(line).append(System.lineSeparator());
                content = sb.toString();
            }

            //移除DLC数据中的HTTP头内容
            String jsn=content.substring(content.indexOf("{"));

            //DLC接收数据处理逻辑
            System.out.println(jsn);
            String jsonreplacd=jsn.replace("[{\"name","\"name");
            System.out.println(jsonreplacd);
            String jsonreplacd1=jsonreplacd.replace("\"name","[\"INSERT INTO jason (ID,sendata) \" + \"VALUES ('1','')");
            System.out.println(jsonreplacd1);
            String jsonreplacd2=jsonreplacd1.replace("')\":\"press\",\"datatype\":\"float\",\"content\":","");
            System.out.println(jsonreplacd2);
            String jsn2=jsonreplacd2.substring(jsonreplacd2.indexOf("["));
            System.out.println(jsn2);
            String jsn3=jsn2.replace("[{","{");
            System.out.println(jsn3);
            String jsn4=jsn3.replace("\"t\"","\\\"t\\\"");
            System.out.println(jsn4);
            String jsn5=jsn4.replace("\"v\"","\\\"v\\\"");
            System.out.println(jsn5);
            String jsn6=jsn5.replace(":",":\\\"");
            System.out.println(jsn6);
            String jsn7=jsn6.replace(",\\","\\\",\\");
            System.out.println(jsn7);
            String jsn8=jsn7.replace("},","\\\"},");
            System.out.println(jsn8);
            String jsn9=jsn8.replace("}]}]}}","\\\"}')\"");
            System.out.println(jsn9);
            String jsn10=jsn9.replace("[","");
            System.out.println(jsn10);
            String jsn11=jsn10.replace("},{","}')\",\"INSERT INTO jason (ID,sendata) \" + \"VALUES ('1','{");
            System.out.println(jsn11);
            String jsn12=jsn11.replace("\",\"","\"@\"");
            System.out.println(jsn12);

            String[] data = jsn12.split("@");
            for(int i=0;i<5;i++) {
                System.out.println(data[i]);
         }

            s.close();
            stmt.close();
            c.close();
        }
        // 新增异常打印,出现问题可以直接看到报错信息
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

第二步:重新编译代码

在~/Music目录下执行编译命令:

javac -cp postgresql-42.2.23.jar serverinsert.java

第三步:执行运行命令

正确的前台运行命令如下:

java -cp .:postgresql-42.2.23.jar serverinsert

如果需要后台运行服务,可使用以下命令:

nohup java -cp .:postgresql-42.2.23.jar serverinsert &

内容的提问来源于stack exchange,提问作者Yushantha chathuranga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:27:03