异常

异常

--------概述:在我们写程序时候难免会出现错误,java中的异常机制为了提高我们程序的健壮性和容错性而存在。

1.1异常的体系

​ java.lang

​ 类 Throwable

​ java.lang.Object

​ java.lang.Throwable

​ 已实现的接口:Serializable

​ 已实现的子类:Error ,Exception

Throwable中方法
方法功能
getMessage()获取异常信息,返回字符串
toString()获取异常类名异常信息,返回字符串。
printStackTrace()打印异常信息栈。
printStaceTrace(PrintStreams)通常用该方法将异常内容存储在日志文件中,以便查阅。
1.2Error:错误

​ Error是throwable的子类,他是程序出现严重的问题,这种问题程序解决不了。

​ 如:因为内存溢出或没有可用的内存提供给垃圾回收器时,Java虚拟机无法分配一个对象,这是抛出该异常。 错误都是以Error为结尾

1.3Exception:异常

​ 异常都是用Exception为结尾。我们可以通过程序来处理异常

异常分为两类:

(1)运行时候的异常:程序在运行期间内报出来的异常

(2)(检查异常)编译期异常:这个异常必须要处理,否则没法编译通过

Exception下面的子类除了RuntimeException以外都是编译期的异常

RuntimeException下面所有子类都是运行时异常。

运行时异常对象会自动向上抛出,调用端再抛给jvm,jvm打印出来异常信息。

异常处理原则

 具体明确

 提早抛出

 延迟捕获

java中进行异常处理的关键字

try {执行可能产生异常的代码}  //需要检测的代码;

catch(异常类 变量){对异常进行处理}  //捕获的异常 catch可以任意多个,每一个捕获一个异常

finally{无论是否发生异常,代码总能运行}  //一定会执行的代码;

/*try catch  try catch finally   try  finally*/

/**
*其中中只有catch才具备捕获异常的能力,当try中出现异常,那根据异常类型选择某个catch来捕获
*,如果有那么当前异常被捕获,不会导致程序终止,程序继续往下执行,没有找到catch那么还会导致程
*序异常终止
*/
throws:声明方法可能要抛出的各种异常

throw:手动抛出异常

处理程序异常

(1)当调用一个可能出现异常的方法时,可以不对异常进行处理,而是再次声明当前方法会出现异常 通过throws异常类型来声明,告诉调用者方法会出现异常,将异常处理交给下一位调用者

(2)使用try-catch-finall来捕获异常

例子:

try{
	int i=0;
	int j=122;        //正常顺序结构运行,一旦运行到某一行出现错误,程序终止 进行异常捕获
	System.out.println(j/i);    //出现异常进行捕获 运行catch 
	System.out.println("xxxx");  //不执行
}
catch(ArithmeticException ex){  //catch并不是捕获所有的异常,只捕获指定类型的异常
//现在这个catch专门捕获ArithmeticException类型的异常
//捕获后一般要给提示
System.out.println("程序出现错误:"+ex.getMessage());
//打印异常信息栈
ex.printStaceTrace(PrintStreams)
}
catch(Exception e){
    //Exception可以表示所有异常类型,所有一般放在catch最后,如果有多个catch必须放在最后
}

自定义异常

1.自定义类一般继承Exception或者其子类

​ (1)子类可以不声明异常

​ (2)如果声明了

​ ①可以声明任意运行时异常

​ ②声明与父类相同的检查异常

​ 子类继承父类重写方法时 父类方法抛出检查异常 子类要么继承父类的检查异常 要么声明这个异常的父类 运行时异常可以捕获也可以不捕获

2.通过构造函数定义异常信息

例:
class DemoException extends Exception{ 

	DemoException(String message){ 

		super(message); 

	} 

}

3.通过throw将自定义异常抛出 (自定义异常和其他异常用法一样)

import java.util.Scanner;

public class No2 {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		while(true) {	
				try {
					System.out.println("请输入一个字符串");
					String  str=in.nextLine();
					play(str);
					break;
				} catch (Exception e) {
					// TODO: handle exception
				//	e.printStackTrace();
					System.out.println(e.getMessage());
				}
		}
	}
	public static void play(String str) throws Exception{
		if(str==null) {
			throw new MyException("字符串不能为空");
		}
		else if(str.equals("")) {
			throw new MyException("字符串不能为空");
		}
		else if(str.matches("[ ]*")) {
			throw new MyException("字符串不能为空");
		}
		else System.out.println("输入正确");
	}


}
/**
*自定义异常
*/
class MyException extends Exception{ 
	MyException(String message){ 
		super(message); 
	} 
}

日志及分类(log)

主要用来记录系统运行中一些重要操作信息

便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因

日志分类

sql日志、异常日志、业务日志

log4j是一个非常优秀的开源日志记录工具

 控制日志的输出级别

 控制日志信息输送的目的地是控制台、文件等

 控制每一条日志的输出格式

如何使用log4j记录日志5-1

第一步:在项目中加入log4j所使用的JAR文件

第二步:创建log4j.properties文件

第三步:编写log4j.properties,配置日志信息

日志初步入门运用

使用

(1)添加jar包

(2)配置文件

​ ①配置输出等级

​ ②输出到那里去(控制台和本地文件)

​ ③输出信息的格式

public class Demo {
	static Logger log=Logger.getLogger(Demo.class);
	public static void main(String[] args) {
		//创建Logger对象,log4j类的记录日志对象
		//在创建日志对象的同时,log4j会读取配置信息,在加载Logger对象时默认读取src目录下的properties配置文件
		//由于我们传递了类的class,logger对象还获取了当前类的信息,记录日志创建的地方
		

```
	//		使用log的方法记录信息

	log.debug("程序启动!");
	
	Scanner in=new Scanner(System.in);
	while(true) {	
			try {
				System.out.println("请输入一个字符串");
				String  str=in.nextLine();
				play(str);
				break;
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
				System.out.println(e.getMessage());
			}
	}


	log.debug("debug调试信息");  
	log.info("info普通信息");
	log.error("error错误信息");
	log.fatal("fatal严重错误");
	
	log.debug("程序结束!");
}

public static void play(String str) throws Exception{
	if(str==null) {
		throw new MyException("字符串不能为空");
		
	}
	else if(str.equals("")) {
		throw new MyException("字符串不能为空");
	}
	else if(str.matches("[ ]*")) {
		throw new MyException("字符串不能为空");
	}
	else System.out.println("输入正确");
}
```

}

class MyException extends Exception{
	MyException(String message){ 

```
	super(message); 

} 
```

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值