java线程中try catch finally块和throw抛出异常

本文介绍了Java中线程的创建及启动方式,并通过实例演示了如何使用Thread类及其run方法。此外,还详细解析了try-catch-finally语句在处理运行时异常中的作用。

先看代码:

public class MyThread extends Thread{

    public static void main(String[] args) {

        Runnable runable = new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("Thread starts executing...");
                        throw new RuntimeException("Exception happends");
                } finally {
                    System.out.println("Finally bolck is called.");
                }
            }
        };

        Thread thread = new Thread(runable);
        try {
            thread.start();
        } catch (Exception e) {
            System.out.println("Exception is caught.");
        }finally{
            System.out.println("This is finally block.");
        }
    }
}

执行结果是
这里写图片描述

剖析这段代码:

  1. 调用对象的start()方法来启动一个线程,然后通过该对象所对应的方法run()来完成其操作的。所以代码先执行thread.start(), 然后执行run().
  2. 对于try+catch+finally,其运行流程:运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码;如果没有异常抛出,执行完try块,也要去执行finally块的代码。然后执行finally块后面的语句。
  3. throw抛出异常: throw是语句抛出一个异常。
    语法:throw new Exception();

Refrence:
Thread的run()与start()的区别
Java中try,catch,finally的用法
Java异常之try,catch,finally,throw,throws

<think> 首先,用户的问题是:“我想了解Javatry catch异常不捕获时是否会抛出”,这似乎是关于Java异常处理的核心概念。用户想知道当try中发生异常catch没有捕获它时会发生什么。 从系统指令看: - 所有行内数学表达式必须用$...$,但这里可能没有数学表达式。 - 独立公式用$$...$$,但可能不需要。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 用户可见层:回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 参考站内引用: - 引用[1]:异常发生时,try代码异常后面的代码不会执行,直接到catch;如果没有捕获,交给虚拟机处理(第一种方式)[^1]。 - 引用[2]:覆盖超类方法时,如果没有抛出异常,必须捕获所有已检查异常[^2]。 - 引用[3]:catch中再次抛出异常,如果finally中有return,异常可能被擦除[^3]。 - 引用[4]:throw执行异常后,程序立即停止;try捕获异常后,还会执行后续代码[^4]。 用户的问题焦点是:当try中发生异常,但catch没有捕获它时,会发生什么? 关键点: - 在Java中,如果try抛出异常,JVM会查找匹配的catch。 - 如果没有catch匹配该异常类型,或者catch没有捕获它,那么异常会传播到调用方法的catch或向上抛出。 - 如果没有任何catch处理它,最终可能由默认的异常处理器处理,导致程序终止并打印堆栈跟踪。 具体到用户的问题:"try catch异常不捕获时是否会抛出",意思是:如果异常没有被捕获(即没有匹配的catch),是否会抛出? 答案是:是的,如果异常没有被捕获,它会继续向上抛出,直到被处理或导致程序崩溃。 结构化回答: 1. **引言**:直接回答用户的问题。 2. **解释机制**:逐步解释Java异常处理的工作原理。 3. **使用引用**:自然地融入站内引用,比如引用[1]提到如果没有捕获,交给虚拟机处理。 4. **示例**:提供一个简单的Java代码示例来说明。 5. **相关建议**:给出一些最佳实践。 6. **生成相关问题**:在回答后添加相关问题。 生成相关问题: - 例如:1. Java中如何处理未捕获的异常?2. 什么是异常链?3. 如何避免异常被吞没? 确保回答真实可靠:基于Java官方文档或可靠来源。Java中,未捕获异常会导致线程终止,除非有未捕获异常处理器。 完整回答结构: - 先回答核心问题。 - 然后解释细节。 - 添加代码示例。 - 结尾添加相关问题。 </think>### Javatry-catch异常未被捕获时的行为 在Java中,如果`try`代码中发生异常,但`catch`**没有捕获该异常**(即没有匹配的异常类型),则该异常会**向上抛出**到调用方法的异常处理机制中。具体行为如下: 1. **异常传播机制**: - 当`try`中的代码抛出异常时,Java虚拟机(JVM)会立即停止执行`try`中的后续代码。 - JVM检查`catch`是否声明了匹配的异常类型(例如,如果抛出的是`NullPointerException`,但`catch`只处理`ArrayIndexOutOfBoundsException`,则不匹配)。 - 如果`catch`未捕获异常异常不会被就地处理,而是**抛出到当前方法的调用者**。例如: ```java public void methodA() { try { methodB(); // methodB抛出未捕获异常 } catch (IOException e) { System.out.println("捕获IO异常"); } } public void methodB() { try { throw new NullPointerException(); // 抛出异常 } catch (ArrayIndexOutOfBoundsException e) { // 类型不匹配,未捕获 System.out.println("不会执行此代码"); } // 异常未被捕获,在此处向上抛出到methodA } ``` 在`methodB`中,`NullPointerException`未被`catch`捕获,因此它会传播到`methodA`。如果`methodA`的`catch`也不匹配,异常继续向上抛出[^1]。 2. **默认处理:虚拟机介入**: - 如果异常在调用链中始终未被捕获(例如,从`main`方法抛出),JVM的**默认异常处理器**会接管。 - 这会导致程序**终止运行**,并在控制台打印异常的堆栈跟踪(stack trace),帮助开发者定位问题。例如: ``` Exception in thread "main" java.lang.NullPointerException at Example.methodB(Example.java:10) at Example.methodA(Example.java:5) at Example.main(Example.java:2) ``` 引用[1]提到:如果catch没有捕获异常,会“交给虚拟机处理”,即JVM强制终止程序[^1]。 3. **关键注意事项**: - **异常类型匹配**:`catch`必须精确匹配异常类型或其父类。如果使用泛化的`catch (Exception e)`,可以捕获所有异常,但不推荐在生产代码中过度使用。 - **已检查异常(checked exceptions)**:对于像`IOException`这样的已检查异常,如果方法签名未声明`throws`,必须在`try-catch`中处理所有潜在异常,否则编译失败。引用[2]强调:覆盖超类方法时,如果父类方法未抛出异常,子类方法也不允许抛出,必须通过`try-catch`处理[^2]。 - **避免异常被吞没**:在`catch`中再次抛出异常(如`throw e;`)或`finally`中使用`return`可能导致原始异常丢失。引用[3]指出:如果`catch`中抛出异常但`finally`有`return`,异常会被“擦除”,程序正常返回而非传播异常[^3]。 #### 最佳实践建议 - 始终为`try`添加能覆盖预期异常的`catch`处理。 - 对于未捕获异常,可以设置全局的`UncaughtExceptionHandler`来处理线程异常。 - 测试代码时,模拟异常场景以确保所有路径被覆盖。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值