错误Bug_Java

本文探讨了Java多线程中,为何在循环中加入`while(true)`会导致线程交叉执行的问题,以及`NoClassDefFoundError`异常的解决方法。在多线程场景下,`while(true)`使得线程持续运行,从而产生了线程交叉的现象。对于类加载异常,原因是初始化阶段静态代码块中出现异常未被捕获,解决方案是将静态代码块中的异常处理起来,确保程序能继续执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2022.10.23

多线程

1.

 /**
     * 乜有加while时,只有窗口一一个线程加上之后有了交叉的线程
     */
    @Override
    public void run() {
        while (true){  //加上之后有了几个线程
            show();
        }
    }

    private static synchronized void show() {  //监视器:当前类
            if (tickets > 0){
                System.out.println(Thread.currentThread().getName() + ":卖票,票号是:" + tickets);
                tickets--;
                try {
                    sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }
    }

继承thread的同步方法,乜有加while(true)之前,只执行窗口一,加上之后开始交叉执行!

为什么加上循环就有了交叉??

2.java.lang.NoClassDefFoundError: Could not initialize class utils.JDBC_Utils

出了这个异常后,自然而然想到jar包中可能没有这个类,查看包中发现有这个类!如果没有这个类会抛出ClassNotFoundException;
继续深究,发现异常信息是java.lang.NoClassDefFoundError: could not initialize class:xxxxxx,自然而然想到java的类加载机制。
java类加载陆续经历,加载、验证、准备、解析、初始化等阶段,而上述异常表明是在初始化阶段出了问题。
在类的初始化阶段,执行方法(由编译器加入),它收集了静态代码块、静态变量赋值,收集顺序与源码中的顺序一致,执行完方法后,才完成类的加载。如果过程中出现错误,会导致类初始化失败。
基于这个原理,再回头看代码,发现类中的静态代码块中出现了异常,但是没有catch,导致出现异常。

 

解决方案:把静态代码块中的代码try-catch一下,把异常抛出去继续执行

3.不是source1,会报空指针(复习静态代码块)

private static DataSource source1;
static {
    try {
        Properties pros = new Properties();
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        pros.load(is);

        source = DruidDataSourceFactory.createDataSource(pros);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
public static Connection getConnection3() throws SQLException {
    Connection conn = source.getConnection();
    return conn;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值