***异常***
一、了解异常的概念
学而时习之,不亦乐乎!
1编写的程序时来源于或者超脱于现实生活
2.生活中的不符合你预期的场景就是异常出现了
*3.*程序中经常会出现的异常
Scanner in = new Scanner(System.in);
System.out.print("请输入除数:");
int num1 = in.next.Int();
System.out.print("请输入被除数:");
int num2 = in.next.Int();
System.out.print(num1+"/"+num2+"="+num1/num2);
System.out.print("感谢使用本程序!");
*4生活中我们不能放弃。程序中也不能放弃*
程序中我们要将上面的代码进行整改,防止输入的错误而导致程序的中断
程序中的解决方案(代码臃肿,不容易补足所有的漏洞)
Scanner in = new Scanner(System.in);
System.out.print("请输入除数:");
//hasNextInt();判断Scanner接受到的你输入的值是否是某个类型。如果是true
if(in.hasNextInt){
//讲类型进行转换
int num1 = in.nextInt();
System.out.print("请输入除数:");
if(in.hasNextInt()) {
int num2 = in.nextInt();
// 排除掉0为除数场景
if(num2 == 0) {
System.out.println("除数不能为0!");
}else {
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}
}else {
System.out.println("对不起!除数必须为整数!");
}
}else {
System.out.println("对不起!被除数必须为整数!");
}
System.out.println("感谢使用本程序!");
}
异常:程序中出现了不正常的情况,会导致程序的中断
二、理解Java异常处理 机制
1.认识一下异常中的常用关键字
try:尝试,试图
catch:捕捉。抓住
finally:最终的,最后的
throw:扔。扔出
throws:抛出,扔(Java编程网络的意:声明异常)
2.会捕捉异常
try–catch
//可能有的代码段
try{
//可能出现异常的代码段
}catch(异常的类型 形参名){
//出现了异常 解决异常的代码段
}
//可能有的代码段
3.加上try--catch后的三种效果
①正常情况:和没有加是一样的效果
②出现了异常后(声明了可以捕获的异常):当try块中的某一行代码出现了异常之后,那么try块中的代码就不会再执行下去了。直接跳转到catch块中进行异常的处理了。处理完之后就继续向下执行了
③出现了异常之后,(异常类型和声明的异常类型不匹配):当try块中的某一行代码出现了异常,那么try块中的代码就不会再去执行了。进入catch块中,但是catch块中声明的异常类型和实际发生的异常类型不匹配,那么异常将不会被处理,会采用默认的处理方式。(它就好像你没有加过try--catch块一样)
4.多重catch块
①try--catch--catch--catch....
多重catch块可以联想到我们之前学习到多重if
②多重catch块的特点:当异常出现之后,会自上而下的进行判断,判断是否有符合catch块中的异常,如果有符合出现类型的异常,就直接执行catch块。后面的catch块就不会再去执行了。
Scanner in = new Scanner(System.in);
try {
// 可能会出现问题的代码
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}catch(InputMismatchException e) {
// 出现了问题之后 如何解决
System.out.println("输入不匹配!必须输入整数!");
e.printStackTrace();
}catch(ArithmeticException e) {
System.out.println("除数不能为0!");
System.err.println(e.getMessage());
}catch(Exception e) {
System.out.println("有异常出现:"+e.getMessage());
}
System.out.println("感谢使用本程序!");
5.try-catch-finally
特点:无论try块中的代码是否有异常,都会执行finally中的代码片段
①出现了退出虚拟机的语句;Ssystem.exit(0);退出虚拟机
②return关键字:结束当前的方法。返回到方法的调用者处。当try-catch中同时出现了return和finally块时。它会先执行finally中的代码块,然后才会执行return
Scanner in = new Scanner(System.in);
try {
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}catch(InputMismatchException e) {
System.out.println("输入不匹配!");
return;
}finally { // 无论是否出现异常 都会执行!
System.out.println("感谢使用本程序!");
}
注意事项:try catch finally 可以随意组合,但是他们不会单独出现
6.异常出现之后,究竟JVM做了什么事情?
当异常出现之后,JVM中会帮助你创建对应的异常类的对象,(例如:new InputMismatchExceptioj(异常信息)),如果没有能够处理try-catch块。采用默认的处理方法,将异常信息进行封装然后进行控制台的打印
7.异常的堆栈跟踪信息:(我们也可以通过异常对象的方法 printStack()来进行输出异常的堆栈跟踪信息。)”
Exception in thread "main"(异常出现在哪个线程里面了)、
java.lang.AtithmeticException(出现了什么类型的异常,)/by zero(异常的缘由信息)
at cn.kgc.demo2.Demo1.main(Demo1.java;21)(异常出现的位置具体到某个包下,某个类下的某个方法,类中的第几行)
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864) // 异常出现的根本位置
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at cn.kgc.demo2.Demo2.main(Demo2.java:10) // 异常出现的直接位置
如果有能够处理的try- catch块,那么JVM会将这个异常类的对象传给catch(异常类型 形参名)块,然后你就可以通过形参去查看异常相关信息或者去做对应的而处理了
三、会抛出异常 throw和throws,(javaWeb部分会再次提到用法)
1.之所以出现了throw和throws的目的就是当某个位置出现了异常之后,如果他不想处理就可以将此异常上抛,上抛给调用者
2.后期的常用形式:为了借助finally块的特点,处理完最终执行的内容之后,再将异常上抛
3.throws:后面接的是此方法可能出现的异常类型,可以同时指定多个,中间用逗号隔开
4.throw:用来抛出异常对象
5.我们可以联想到子类重写父类的方法:子类重写父类的方法的时候,子类的这个方法不能抛出比父类更多的异常,也不能抛出更大的异常
四、了解Java异常体系结构(类的家族树)
①最大的是:Throwable
②Throwable又分为:Exception 和Error
③Error:程序无法通过代码来修复,必须人工干预解决,常见的错误有:OutOfMenmoryError内存溢出
还有一个是:StackOverflowError堆栈溢出,编译错误,(语法错误等)
④Exception :程序在执行过程中,可能会出现一些问题,可以提前做好处理工作
⑤RuntimeException:运行时异常,例如:InputMismatchException输入不匹配异常
ArrayIndexOutOfBoundExceotion数组下标越界
NullPointerException空指针异常
ClassCastException类型转换异常
⑥checked异常:受检异常/检查异常 例如:
FileNotFoundException文件找不到异常
ClassNotFoundException类找不到异常
java程序中人家认为这种异常很有可能出现,所以必须要提前解决!增强程序的健壮性
自定义异常:
/**
* 自定义异常(异常种类更加丰富 更加具体)
* @author xiaobu
* 2019年2月18日 上午11:51:42
*/
public class IllegalAgeException extends RuntimeException{
public IllegalAgeException(String message) {
super(message);
}
public IllegalAgeException() {
}
}
五、了解异常记录(目前作为了解)–日志(log4j)
1.日志:(记录东西)在程序运行期间,记录程序的运行状态,用户的操作行为。异常情况的一种日志。
2.记录日志通常用*.log
3.日志是为了以后我们分析程序运行情况和解决问题的根据!重要!
4.日志记录工具/框架:log(log for java )logback
①下载jar包(人家编写好的代码的字节码压缩包)
②将jar包引入到你的工程内(先建立一个lib文件夹,将jar包放进去,右键jar包进行build path--然后进行add--)
③像使用JRE的类库一样去使用它就行
5. 日志的集中记录方法、
①info();记录普通的信息
②error();记录错误的信息
③debug();记录一下特别的普通的信息