Java异常处理

文章详细介绍了Java中的异常处理机制,包括try-catch-finally关键字的使用,异常的类型,以及如何通过throws声明异常。此外,还讨论了日志系统的重要性,特别是Log4j的配置和使用,包括日志级别、输出目的地和布局类型。

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

  1. 什么是异常

异常就是在程序运行过程中所发生的不正常事件;(异常会中断正在运行的程序)

  1. 常见异常

文件丢失 网络中断 算数运算出错 数组下标越界 装载不存在的类 对空对象操作 类型转换异常

  1. 什么是异常处理

在程序执行代码的时候,万一发生了异常,程序会按照预定的处理方法对异常进行处理,异常处理完毕后,

程序继续运行

  1. 使用if-else处理异常的机制特点
  1. 代码臃肿
  2. 影响开发效率
  3. 难以列举其他异常
  4. 可读性差,维护强度弱
  1. Java的异常处理

Java的异常处理用五个关键字来实现:try catch finally throw throws

  1. try catch 块
  1. 首先执行try块中的语句,如果try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略
  2. 首先执行try块中的语句,如果try块在执行过程中遇到异常,并且这个异常与catch中声明的异常类型相匹配,那么在try块中其余剩下的代码都将会被忽略,而相应的catch块将会被执行。匹配是指catch所处理的异常类型与

所生成的异常类型完全一致或是它的父类

  1. 首先执行try块中的语句,如果try块在执行过程中遇到异常,而抛出的异常在catch块里面没有被声明,那么程序立刻退出
  1. 在catch块中可以加入用户自定义处理信息
  1. Void printStackTrace();输出异常的堆栈信息。堆栈信息包括程序运行到当前类的执行流程,它将输出

从方法调用处到异常抛出处的方法调用序列

  1. Sring getMessage();返回异常信息描述字符串。该字符串描述异常产生的原因,是printStackTrace()方法输出信息的一部分
  1. 常见的异常类型

Exception   异常层次结构的根类

ArithmeticException 算数错误情形,如以零作为除数

ArrayIndexOutOfBoundsException 数组下标越界

NullPointerException 尝试访问null对象成员

ClassNotFoundException 不能加载到所需的类

InputMismatchException  想要得到的数据类型与实际输入的类型不匹配

IllegalArgumentException 方法接收到非法参数

ClassCastException 对象强制类型转换出错

NumberFormatException 数字格式转换异常,如把”abc“转换为数字

  1. try-catch-finally
  1. 如果try块中所有语句正常执行完毕,那么finally块就会被执行
  2. 如果try语句块在执行过程中碰到异常,无论这种异常能否被catch块捕获到,都将执行finally块中的代码
  3. try-catch-finally中try块是必要的,catch和finally块可选,但至少要出现其一
  4.  即使在try块和catch块中存在return语句,finally块中的语句也会被执行。发生异常时的执行顺序:

执行try块或catch块中return之前的语句,再执行finally块中的语句,最后执行try块或catch中的return语句退出

  1. finall块中的语句不被执行的唯一情况,在异常处理代码中执行System.exit(1),将退处Java虚拟机
  1. 多重catch块

一段代码可能会引发多种异常,这时可以在一个try语句块后面跟多个catch语句块,分别处理不同 的异常

但排列顺序必须是从子类到父类,最后一个一般是Exception类。因为所有的异常都继承自Exception类,所以

如果将父类异常放到前面,那么所有的异常都将会被捕获,后面catch块中的子类异常将得不到被执行的机会

try{

}catch(NumberFormatException e){

}catch(Exception e){

}finally{

}

  1. 声明异常-throws

Java语言通过关键字throws声明某个方法可能抛出的个中异常。Throws可以同时声明多个异常,中间用逗号隔开

12处理异常的方式-throws

  1. 通过try-catch捕获并处理异常
  2. 通过throws继续声明异常,如果调用者不打算处理异常,则可以继续通过throws声明异常

让上一级调用者处理。Main方法的异常将由Java虚拟机处理

  1. 抛出异常-throw

在Java语言中,可以使用throw关键字来自行抛出异常,交给调用者解决

  1. throw和throws的区别

(1)作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出的异常

(2)使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,

不能单独使用

  1. 内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类
  1. Java的异常体系

Java的异常包括许多异常类,他们之间存在继承关系(所有类都继承object类)

  1. throwable:所有异常类型都是throwabl类的子类,它派生两个子类error和exception
  2. Error类:表示仅靠本程序本身无法恢复的严重错误,如内存溢出,动态连接失败,虚拟机错误。应用程序

不该抛出这种类型的对象(一般由虚拟机抛出)。假如出现错误,除了尽力使程序安全退出外,在其他方面是无能为力的

  1. Exception类:由Java应用程序抛出和处理的非严重错误
  2. RuntimeException:运行时异常,包括RuntimeException类及其所有子类,不要求程序必须对他们进行处理

仍旧可以进行编译和运行,如果运行时发出异常,会输出异常的堆栈信息并中止运行程序

  1. Checked异常:非运行时异常(编译异常) 除了  运行时异常外的其他由Exception继承来的异常,

程序必须捕获或者声明抛出异常,否则会出现编译错误,无法通过编译。处理方式:(1)try-catch(2)通过throws声明抛出异常,交给上一级调用方法处理

  1. 日志

日志主要用来记录系统运行过程中的一些重要的操作信息,便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到发生的原因

分类:

  1. SQL日志:记录系统执行的SQL语句
  2. 异常日志:记录系统运行中发生的异常事件
  3. 业务日志:记录系统运行过程,如用户登录,操作记录
  1. 使用log4j的步骤
  1. 在项目中加入log4j所使用的JAR文件,在MyEclipse选中要使用log4j的项目,然后依次选择

Project  properties    Java Build Patch    Libraries  Add Extermal JARs

  1. 创建log4j.properties文件(src)
  2. 编写log4j.properties文件,配置日志信息
  1. 配置

log4j.rootLogger=debug,stdout,logfile

debug指的是日志记录器(Logger)的输出级别

fatal :指出严重的错误事件将会导致应用程序的退出

error:指出虽然发生错误事件,但仍然不影响系统的继续运行

warn:表明会出现错误的潜在情形

info :在粗粒度级别上指明信息,强调应用程序的运行过程

debug:指出细粒度信息事件,对调试应用程序是非常由帮助的

输出级别优先级

fatal>error>warn>info>debug

18.日志输出目的地

log4j.rootLogger=debug,stdout,logfile

Stdout,logfile 指的是日志输出地的名字,log4j允许有多个目的地,一个输出目的地称为 Appender

常用的目的地有两种方式:

  1. ConsoleAppender:输出日志事件到控制台。通过Target属性配置输出到System.out 或 System.err

默认的目标是System.out

  1. FileAppender:输出日志事件到一个文件。通过File属性配置文件路径和名称(默认同项目)
  1. 日志布局类型Layout

目的地必须使用一个与之关联的布局类型Layout,用来指定它的输出样式

  1. HTMLlayout:格式化日志输出为HTML表格
  2. SimpleLayout:以一种非常简单的方式格式化日志输出,它输出级别Level,然后跟着一个破折后”——“最后是体制信息
  3. PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多彩的输出格式,需要配置layout.ConversionPattern
  4. ConversionPattern转换模式
  1. %d用来设置输出日志的日期和事件,默认格式为ISO8610.也可以在其后指定格式,比如

%d{yyyy-MM-dd HH-mm-ss}

  1. %m:用来输出代码的指定信息
  2. %n:用来输出一个回车换行符
  3. %l:用来输出日志事件的发生位置,包括类名,发生的线程
  4. %p:用来输出优先级
  5. %F:用来输出文件名
  6. %M:用来输出方法名
  1. 日志的使用

创建一个私有静态的Logger对象,然后就可以通过它的debug()或者error()等方法输出日志信息了

Private static Logger logger=Logger.getLogger(本类名.class.getName());

 Logger 对象是用来替代System.out 或者 System.err 的日志记录器

方法

Public void 输出级别(Object  msg)

Public void 输出级别(Object  msg,Throwable t)

  1. 常用

### 设置logger的输出级别和输出目的地###

log4j.rootLogger=info,stdout,logfile

###把日志信息输出到控制台###

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.err

###log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout###

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %l %m %n

###把日志信息输出到文件###

log4j.appender.logfile=org.apache.log4j.FileAppender

log4j.appender.logfile.File=jbit.log

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

###log4j.appender.logfile.layout.ConversionPattern=%d %l %F %p %m%n###

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值