简单的异常、异常链介绍

Java异常处理与线程安全
本文介绍了Java编程中异常的概念,展示了如何通过try-catch解决异常导致的程序中断问题。通过示例代码解释了如何捕获并处理异常,确保程序的线程安全。同时,提到了异常链的产生,并给出一个异常处理的例子。此外,还提及了ThreadLocal在处理线程内共享数据时的作用。

异常

什么是异常?

异常是java程序在运行期间的一种事件,通过异常处理机制能够处理程序正常之外的时间


举一个简单例子

会导致整个线程无法执行
package com.weiyang;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       int a1=change("234");
       int a2=change("4456");
       int a3=change("serith");//转换不了也输出不了,会导致整个无法进行
       System.out.println("hai");//也输出不了'hai'
	}
	public static Integer change(String x) {
		return Integer.parseInt(x);
	}

}

结果如图:


解决方法:

可以使用try catch 来解决异常问题

throws 直接抛出异常 其中Exception是所有异常的祖宗,通常写这一个就可以

catch  是接住异常,throw抛出的异常是第一个catch接住并处理

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       try {
		int a1=change("234");
		int a2=change("4456");
		int a3=change("serith");
	} catch (Exception e) {
		// TODO Auto-generated catch block
		 //e.printStackTrace();
		 System.out.println("错误原因:"+e.getMessage());
	}
     
 
       System.out.println("Hi!");
	}                                         //这里是throws
	public static Integer change(String x) throws Exception{//直接抛出异常
		try {
			return Integer.parseInt(x);
		}catch(Exception e) {
			throw new Exception("传入参数有问题,参数值是"+x);//百分之白出问题,把异常传给e.getmessage()
		}    //这里是throw    catch可以接住异常 并处理 第一个catch接住异常
		
		
	}

结果如图:

异常链产出:

package com.weiyang;

public class Test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
      m1();
	}
	public static void m1(){
		m2();
		
	}
   public static void m2(){
		
	   try {
		m3();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		System.out.print(e.getMessage()+"m2");//获取m5抛出的异常给到e。getmassage
	}//e 是线程内共享
	}
   public static void m3() throws Exception{
	m4();
	
   }
    public static void m4() throws Exception{
	 m5();
	
    }
     public static void m5() throws Exception{
	   throw new Exception("有病");
	
}

}

结果:

Tips:

ThreadLocal 是一个类,线程内共享,只能在自己的类中访问,是线程级别的作用域

System.out.print(e.getMessage()+"m2");   //其中e 是线程内共享

### Java 中基于异常处理的责任链模式实现 责任链模式是一种行为型设计模式,其主要目的是让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。在 Java 的异常处理场景下,可以通过构建一个由不同异常处理器组成的链条来实现这一目标。 #### 基本概念 1. **抽象处理者(Handler 接口)** 定义了一个通用的方法 `handleRequest` 来处理请求或异常,并通过设置后续节点建立链路[^2]。 2. **具体处理者(Concrete Handler)** 每个具体处理者实现了自己的逻辑并决定是否继续传递请求到下一个节点[^3]。 以下是完整的实现与示例: --- ### 代码实现 #### 抽象处理者类 ```java public abstract class ExceptionHandler { protected ExceptionHandler nextHandler; public void setNext(ExceptionHandler handler) { this.nextHandler = handler; } public abstract void handleException(Throwable exception); } ``` 此部分定义了基础方法 `handleException` 和用于链接其他处理者的属性 `nextHandler`[^2]。 --- #### 具体处理者 A - NullPointer 异常处理 ```java public class NullPointerExceptionHandler extends ExceptionHandler { @Override public void handleException(Throwable exception) { if (exception instanceof NullPointerException) { System.out.println("NullPointerException caught and handled."); } else if (this.nextHandler != null) { this.nextHandler.handleException(exception); } } } ``` 这里针对特定类型的异常进行了捕获和处理操作;如果没有匹配,则会调用下一环节继续查找合适的处理器[^1]。 --- #### 具体处理者 B - IllegalArgumentException 处理 ```java public class IllegalArgumentExceptionHandler extends ExceptionHandler { @Override public void handleException(Throwable exception) { if (exception instanceof IllegalArgumentException) { System.out.println("IllegalArgumentException caught and handled."); } else if (this.nextHandler != null) { this.nextHandler.handleException(exception); } } } ``` 类似于前一节的设计思路,只是专注于另一种常见的运行时错误类型即非法参数输入情况下的响应机制[^1]。 --- #### 测试客户端程序 ```java public class ChainOfResponsibilityDemo { public static void main(String[] args) { // 创建各个级别的异常处理器实例 ExceptionHandler npHandler = new NullPointerExceptionHandler(); ExceptionHandler iaHandler = new IllegalArgumentExceptionHandler(); // 构建责任链 npHandler.setNext(iaHandler); try { throw new NullPointerException("This is a test NPE"); } catch (Throwable e) { npHandler.handleException(e); // 将异常交给第一个处理器去解决 } try { throw new IllegalArgumentException("Test IAE"); } catch (Throwable e) { npHandler.handleException(e); // 同样交予初始入口点管理整个流程走向 } } } ``` 这段测试脚本展示了如何初始化两个独立但相互关联起来的异常捕捉单元,并验证它们能否按照预期顺序运作以及正确应对各自负责领域内的突发状况[^3]。 --- ### 总结说明 以上展示了一套简单易懂又灵活可扩展的解决方案框架,适用于任何需要分层次逐步解决问题的应用场合。通过这种方式不仅可以有效降低模块间的依赖程度还能增强系统的鲁棒性和适应能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值