为什么for循环中的异常没有被捕获到呢?

这是java多线程编程核心技术上的事例,书上是把try写在for循环外面,能够捕获到
异常,但我把try写到for里面后,发现捕获不到异常
public class MyThread extends Thread {

/*@Override
public void run() {
    try {
        for (int i = 0; i < 500000; i++) {
            if (this.interrupted()) {
                System.out.println("已经是停止状态了!我要退出了!");
                throw new InterruptedException();
            }
            System.out.println("i=" + (i + 1));
        }
    } catch (InterruptedException e) {
        System.out.println("catch interruted exception");
        e.printStackTrace();
    }
}*/


public void run() {

        for (int i = 0; i < 500000; i++) {
            try {
            if (this.interrupted()) {
                System.out.println("已经是停止状态了!我要退出了!");
                throw new InterruptedException();
            }
            System.out.println("i=" + (i + 1));
            } catch (InterruptedException e) {
                System.out.println("catch interruted exception");
                e.printStackTrace();
            }
        }
}


public static void main(String[] args) {
    try {
        MyThread t = new MyThread();
        t.start();
        Thread.sleep(2000);
        t.interrupt();
    } catch (InterruptedException e) {
        System.out.println("主线程被捕获");
        e.printStackTrace();
    }

}

}


2个回答

你是多线程程序,你捕捉的异常不是在你的所在的线程中,所以捕捉不到

leohe2016
LeoFaye 那为什么写在for循环外面可以呢,不是很明白,
大约 2 年之前 回复

你需要在发生Exception时加一个break或return



public void run() {

        for (int i = 0; i < 500000; i++) {
            try {
            if (this.interrupted()) {
                System.out.println("已经是停止状态了!我要退出了!");
                throw new InterruptedException();
            }
            System.out.println("i=" + (i + 1));
            } catch (InterruptedException e) {
                System.out.println("catch interruted exception");
                e.printStackTrace();
                break;
            }
        }
}

yujiaao
COCO_AS 我想这可能和jvm处理exception有关,你可以查查jvm处量exception的资料,具体我也不是很清楚,在大量输出时,时间顺序是不可靠的
大约 2 年之前 回复
yujiaao
COCO_AS 回复COCO_AS: 看不到很可能是输入缓冲的造成的假像,如果 if(i/1000 == (i-i%1000)/1000) System.out.println("i=" + (i + 1)); 你就一定能看到了
大约 2 年之前 回复
leohe2016
LeoFaye 回复COCO_AS:确实看到了!!但是为什么不加看不到啊大神?之前我都输入到txt文本里一行行看了都没有,,
大约 2 年之前 回复
yujiaao
COCO_AS 回复LeoFaye: 加了你就能看到了
大约 2 年之前 回复
leohe2016
LeoFaye 但是如果catch到的话,应该会打出catch interruted exception 这句话呀,可是没有打印,,证明没进入catch
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问