异常
--------概述:在我们写程序时候难免会出现错误,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);
}
```
}