java不求有功,但求无过—异常处理

本文介绍了程序开发中的异常处理机制,包括异常的分类、常见的异常类型及其处理方式。通过实例展示了如何使用try、catch和finally等关键字来管理和捕获异常,确保程序在遇到问题时能够稳定运行。

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

   在程序开发中,错误往往有两种。一种是编译时出现的错误,该种错误比较容易发现。另一种是运行时出现的错误,该种错误是开发人员比较头疼的。异常就是一个运行时的错误,例如,除数为0 ,数组越界等。 


   异常处理,就是我们定义一个代码段(可能出错的代码段)来捕获和处理异常。 这样当异常情况发生时,一个代表该异常的对象会被创建,并在产生异常的方法中被引发。该方法可以选择自己处理异常,也可以抛出该异常,但无论是哪种,最终异常都会被处理。  

例如以下的代码:

import java.io.*;


public class TestEx{
	public static void main(String[] args){
		int[] arr= {1,2,3};
		System.out.println(arr[2]);
		try{
			System.out.println(2/0);
		} catch(ArithmeticException ae){
			System.out.println("系统正在维护,请稍候!");
			ae.printStackTrace();//错误的堆栈信息
		}
	}
}

   其中 System.out.println(2/0); 则是我们可能出现错误的代码段。Catch 中我们自己定义异常出错的对象,即ae ,一旦出现错误就被初始化。

   System.out.println("系统正在维护,请稍候!");

   ae.printStackTrace();

则是我们对捕获到的异常做出的处理 。



异常的分类 :



如上图,Throwable 是所有异常的父类。  在它之下有两个子类,Error和Exception。

   Error: 是指系统错误,例如虚拟机错误,不能被处理。 

   Exception: 能够处理的异常 
   RuntimeException:能处理但不处理,例如除数为0 ; 数组下标越界


   java异常处理关键字


   Try:意思就是试试它包含的代码段中是否会发生异常。
   catch:捕捉的意思,就是有异常发生时进行捕获,并进行相应的处理。 
       Try 和catch的关系可以是1对1 ,也可以是多对多 ;catch的出现必须有try。
   Finally:由于try块中代码段出现异常时,不被执行。但是有时候我们希望无论异常是否发生,某段代码都被执行,例如释放分配中的资源时。


FileInputString in = null;
        try{
                in = new FileInputStream("myfile.txt");
                int b; 
                b = in.read();
                while (b !=-1){
                        System.out.println((char) b);
                        b = in.read();
                }
                
        }catch (FileNotFoundException e){
        
                System.out.println(e.getMessage());
                
        }finally{
        
                try {
                        in.close();
                        
                } catch(IOException e){
                
                        e.printStackTrace();
                }
        }
        


   getMessage和printStackTrace两个方法用于输出异常信息。 前者用于获得异常信息的字符串,后者可以将方法调用堆栈中的信息打印出来,方便程序员测试。 


   使用自定义的异常

private int getTotalRecords(Connection conn)throws SQLException
	{
		String sql = "select count(*) from t_user where user_id <> 'root'";
		PreparedStatement pstmt = null; 		
		ResultSet rs = null;	
		int count = 0;
		try{
			pstmt =conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			rs.next();
			count = rs.getInt(1);
		}finally{
			DBUtil.close(rs);
			DBUtil.close(pstmt);
		}
		return count;
	}


}

   说明:定义一个getTotalRecords 的方法,并用throws语句说明可以跑出用户自定义的异常类SQLException。 
throws是用来声明一个方法可能抛出的所有异常信息

throw则是指抛出的一个具体的异常类型。

   通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。

   总结:人生道路不可能是那么的一帆风顺的。就好像你开车去旅行的时候,或许你会碰到你车子哪个零部件坏了,引发了Error异常。也或许是前面有大石头挡着你的去路,引发了 Exception异常。遇到这种情况,你有两种选择,一是你自己找个大的木棍把它撬走。二是打电话交给管理道路的人员处理。但是其实你在旅行的道路中,还会遇到很多很多的小石子,这就相当于是RuntimeException,但是我们不可能一个个的去处理这些小石子,因为工作过于繁杂。

   总的来说,引入异常处理机制,可以方便我们开发人员调试; 保证程序在出现异常情况下能正确执行,提高程序的健壮性 。








资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值