异常处理总结

 

 

 

 

 

 

 

目录

异常概述

捕获异常(1、try-catch-finally)

抛出异常(2、throw throws)

自定义异常类

代码调试 

Log4j


 


异常概述

  1. Java语言将程序运行过程中所发生的不正常严重错误称为异常,对异常的处理称为异常处理。
  2. 它会中断正在运行的程序,正因为如此异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点。
  3. 发生异常后,后面的代码都不会再执行。

异常分类

 

Error: 指合理的应用程序在执行过程中发生的严重问题。当程序发生这种严重错误时,通常的做法是通知用户并中止程序的执行。Error错误不用我们处理。

Exception又主要分为两类:

运行时异常(RuntimeException):RuntimeException异常类及其下面的子类均为运行时异常。

检查时异常CheckedException):Exception异常类及其子类(除去RuntimeException异常类及其子类)都是检查时异常。

运行时异常和检查时异常:

1、运行时异常:则该异常类继承RuntimeException;

检查时异常:则不继承。

2、运行时异常:程序可以不处理该异常依然可以生成javac;

检查时异常:则必须显示处理。

因为发生异常后,后面的代码都不会再执行,所以要对异常进行处理

Java中对异常的处理有如下两种方式:

1、通过trycatchfinally关键字捕获异常;

2、通过throwthrows关键字抛出异常;


捕获异常(1、try-catch-finally

语法结构:

捕获异常语法结构:

try{
      //可能抛出异常的语句块
}catch(SomeException1 e){ // SomeException1特指某些异常 
     //当捕获到SomeException1类型的异常时执行的语句块
} catch( SomeException2 e){
     //当捕获到SomeException2类型的异常时执行的语句块
}finally{
     //无论是否发生异常都会执行的代码
}
  • try…catch…finally异常处理结构中,try语句块是必须的,  catchfinally语句块至少出现一个。
  • 注意如果try语句块包含的是检查时异常,则在没有通过throws抛出该异常类的情况下,try必须和catch一起使用,当该行代码去掉或注销掉时,catch相应的异常语句块必须去掉,如下代码:

 多重catch:

  • try语句块中的代码可能会引发多种类型的异常,当引发异常时,会按顺序查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句,其后 catch 语句被忽略。

 

  • 在捕获异常的时候,应按照“从小到大”的顺序捕获异常,即先子类后父类。

注意:在捕获异常时一定要先子类后父类,不能先父类后子类。

public class TestException {

	public static void main(String[] args) {
		try {
			String[] nameArray = { "小王", "小李", "小高" };
			for (int i = 0; i < 4; i++) {
				System.out.println(nameArray[i]);
			}
		} catch (ArrayIndexOutOfBoundsException e) {// 捕获下标越界异常
			System.out.println("发生数组下标越界异常,成功捕获!");
		} catch (RuntimeException e) {// 捕获运行时异常
			System.out.println("发生运行时异常,成功捕获!");
		} catch (Exception e) {// 捕获所有异常
			System.out.println("发生异常,成功捕获!");
		}
		System.out.println("显示完毕!");
	}
}

finally关键字 :

  • Java异常在try/catch块后加入finally块,可以确保无论是否发生异常 finally块中的代码总能被执行。

 


抛出异常(2、throw throws

throw关键字:

  • throw用于抛出具体异常类的对象,一般用于方法体中。
  • 什么时候使用:当所写的代码因不满足某些条件致使程序无法运行时可以借助throw抛出一个异常对象提醒程序员。
  • throw关键字一般用在方法体中,也可以用在代码块中,但如果代码块中抛出的异常对象是由检查时异常创建的,则必须使用try-catch进行处理。
  • throw将异常对象抛给谁:
  1. 抛给自己:异常抛出后直接使用try-catch进行处理
  2. 抛给方法调用者:仅仅使用throw关键字将异常对象抛出,此处没做任何处理;如果抛出的异常类对象是由检查时异常类创建的,则还需要使用throws抛出抛出创建该异常对象的异常类或其父类。方法调用者有两种选择:(1)方法调用者使用try-catch处理该异常(推荐)。 (2)方法调用者继续上抛该异常,由于方法抛出的是运行时异常类创建的对象,所以可以如下这样做;如果抛出由检查时异常类创建的对象,则这种处理方式必须使用throws关键字抛出创建该对象的异常类或其父类
  • 使用throw抛出异常对象如果没有try-catch捕获该异常对象,则该抛出异常对象语句执行后其所在方法结束执行。

throws关键字:

 

  • throws用于声明方法可能抛出的异常,其后为异常类,可以有多个,异常类之间用英文逗号间隔。
  • 什么时候使用:
  1. 当方法体中的throw关键字抛出由检查时异常创建的对象时,如果该异常对象在抛出的同时已经通过try-catch进行了处理,则可以不使用throws,否则必须使用throws抛出创建该对象的异常类或其父类。
  2. 所调用的方法抛出了检查时异常时,如果该方法在调用的同时已经通过try-catch进行了处理,则可以不使用throws继续上抛该异常,否则必须使用throws才能上抛该异常,此时上抛的异常类可以是调用方法时方法抛出的异常类也可以是其父类。
  • 如果方法中的异常已经通过try-catch进行了捕获则无需再使用throws上抛该异常了,否则即使上抛也无效,只会做无用功。
  • 如果方法中的代码或者方法中所调用的代码没有使用throw抛出异常类对象,则无需使用throws否则该throws所抛出的异常类无效:即使用throws则其方法中的代码一定存在使用throw抛出异常对象的代码。

 

throw与throws的区别:

1、抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;

2、使用位置不同:throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必须使用try-catch自行处理;throws只能用在方法声明括号后面。

1、throw抛出的是异常对象;throws抛出的是异常类

2、throw用在方法体,如果用于代码块,则在抛出检查时异常对象前提下需要;throws必须用在参数列表后

注意:如果throw抛出的是检查时异常,则必须显示处理;

如果throw抛出的是运行时异常,则可以不用显示处理。


自定义异常类

  • 为什么?

Java API提供的已有异常类无法准确表述当前发生的异常问题,这时就需要创建自定义的异常。

  • 怎么做?

创建继承Exception 或其子类的自定义类;

自定义异常类调用父类构造函数(通常是含有一个String类型参数的构造函数)

例如:创建如下的一个项目

package com.lc.exception;

public class AgeException extends Exception {
	
	public AgeException(String message) {
		super(message);
	}
}
package com.lc.vo;

import com.lc.exception.AgeException;

public class Person {

	private int age;// 年龄

	public int getAge() {
		return age;
	}
	
	public void setAge(int age) throws AgeException {
		if (age < 0 || age > 150) {
			throw new AgeException("年龄必须在0~150之间:" + age + "不合理!");
		} else {
			this.age = age;
		}
	}
}

 

package com.lc.test;

import com.lc.exception.AgeException;
import com.lc.vo.Person;

public class Test {

	public static void main(String[] args) {
		Person person = new Person();
		try {
			person.setAge(1000);
		} catch (AgeException e) {
			e.printStackTrace();
		}
	}
}

代码调试 

  • Eclipse开发工具中F5F6F7F8 四个快捷键能辅助我们很好地进行代码的调试,各快捷键的作用如下:

F5:跳入方法;

F6:向下逐行调试;

F7:跳出方法;

F8:直接跳转到下一个断点;

  • Eclipse开发工具中F5F6F7F8 四个快捷键对代码的调试实质是人为地控制代码的运行过程。

Log4j

  • Log4jApache的一个开源项目,通过使用Log4j,可以控制日志信息格式及其输送目的地(控制台、文件、数据库等),方便后期查找系统运行期间出现的问题,进而便于维护系统。
  • 步骤:

1、第一步:导入log4j-1.2.15.jar依赖包;

2、第二步:在src根目录下创建名为log4j.properties的文件,文件内容如下:

# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,Console,RollingFile

#将日志信息输出到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern= [%-5p]-[%d{yyyy-MM-dd HH:mm:ss}] -%l -%m%n
#将日志信息输出到操作系统D盘根目录下的log.log文件中
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=D://log.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n

3、第三步:src目录创建Test类,代码如下:

import org.apache.log4j.Logger;
 
public class Test {
 
	private static final Logger logger = Logger.getLogger(Test.class);
 
	public static void main(String[] args) {
		try {
			Class.forName("ErrorClassName");
		} catch (ClassNotFoundException e) {
			logger.debug(e.getMessage(),e);//详细日报信息
			logger.info(e.getMessage(),e);//详细日报信息
			logger.warn(e.getMessage());//简单日报信息
			logger.error(e.getMessage());//简单日报信息
		}
          }
}
  • 经过上述三步,最终Java工程结构如下:

 

 

 

  • 运行Test类方法,打开D盘根目录中log.log文件可以看到相应的日志信息,此时的日志信息都会显示出来,Log4j常用日志级别从高到低依次为:ERRORWARNINFODEBUG,由于上例所设置的Log4j日志级别为DEBUG,所以ERRORWARNINFO 级别的日志信息也会显示出来。

 


 

封装:公共方法操作私有属性。可以给私有方法加上限制。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值