欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第十五课:异常

程序员文章站 2022-07-14 12:30:32
...

第十五课:异常
一、了解异常的概念
•编写的程序是来源或超脱于现实生活的
•生活中 不符合你预期情况的场景 就是出现异常了
•程序中的异常:
Scanner in = new Scanner(System.in);
System.out.print(“请输入被除数:”);
int num1 = in.nextInt();
System.out.print(“请输入整数:”);
int num2 = in.nextInt();
System.out.println(num1+”/”+ num2 +”=” +num1/ num2);
System.out.println(“感谢使用本程序!”);

•生活中不能放弃,程序中也不能放弃
•程序中的解决方案为:(代码臃肿,补足很困难!)
Scanner in = new Scanner(System.in);
System.out.print(“请输入被除数”);
// hasNextXXX() 判断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异常处理机制
•try:尝试 试图
•catch:捕捉 抓住
•finally:最终的 最后的
•throw:抛出 扔
•throws:抛出 扔(Java编程网络释义:声明异常)
2.1会捕捉异常(try-catch)
1.try-catch

   // 可能有代码段
   try{
       // 可能会出现异常问题的代码
   }catch(异常类型 形参名){
       //出现了异常 解决异常的代码
   }
   //  可能有代码段
   
  •正常情况:与没加效果一致
  •出现了异常(声明了可以捕获):当try块中的某一行代码出现了异常,那么try块

中的后续代码将不再执行,直接会跳转到catch块中进行异常的处理,处理完之后
继续向下执行
•出现了异常(异常类型不匹配):当try块中的某一行代码出现了异常,那么try块
中的后续代码将不再执行,catch块中声明得异常类型不匹配,那么异常将不会被
处理,会采用默认处理方式(它就好像你没加过try-catch一样)
•联想:缉毒警察解决不了防暴警察的活
2.try-catch-catch…
多重catch的情况(联想多重if)
•特点:当出现异常时,会自上而下的进行判断,判断是否符合catch块中的异常,
如果能符合,直接执行此catch块,后续的catch不会触发!
联想多重if记住 最容易匹配的 不要放在前方 因为多态的原因,如果你

将父类放在上方,下方的子类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.out.println(e.getMessage());
}catch(Exception e){
System.out.prinln(“有异常出现:”e.getMessage());
}
System.out.println(“感谢使用本程序!”);
3.try-catch-finally
•特点:无论try块中代码是否有异常,都会执行finally块中的代码片段
①出现了退出虚拟机语句:System.exit(0);
②return关键字:结束当前方法,返回到方法的调用者处 当try-catch中同时出
现了return和finally块,它会先执行fianlly块中的代码,然后才执行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可以随意组合,但是它们不能单独出现
   •异常出现之后,究竟JVM在做什么事?
     当异常出现之后,JVM中会帮你创建对应异常类型的对象(例如:new
   InputMismatchException(异常提示信息)),如果没有(能处理的)try-catch,采用
   默认 将异常信息进行封装 然后在控制台打印
  ○异常的堆栈跟踪信息:(我们也可以通过异常对象的方法 printStackTrace()来输

出异常的堆栈跟踪信息)

Exception in thread “main”(异常出现在哪个线程) java.lang.ArithmeticException(出
现了什么类型的异常): / 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(异常类
型 形参名)块,然后你就可以通过形参去查看异常相关信息或做对应异常处理了
2.2会抛出异常(throws throw)(JavaWeb部分会再次提到用法)
•不处理 ->
•之所以出现throw和throws的目的就是当某个位置出现异常之后,如果它不想处理
就可以将此异常上抛,上抛给调用者
•后期的常用形式:为了借助finally块的特点,处理完最终执行内容之后,再将异常
上抛
•throws:后面的接的是此方法可能出现的异常的类型 可以同时指定多个 逗号隔

•throw:用来抛出异常对象

  子类重写父类方法:
      子类重写父类方法,这个方法不能抛出比父类更多的异常,也不能抛出更大的异

三、了解Java异常体系结构(类的家族树)
Throwable
Error Exception
•Error:程序无法通过代码来修复!必须人工干预解决 OutOfMemoryError 内存溢出
*Error 堆栈溢出等 编译错误(语法错误)等
•Exception:程序执行过程中,可能会出现一些问题,可以提前做好处理工作
○RuntimException:运行时异常 例如:InputMismatchException
ArrayIndexOutOfBoundsEception NullPointerException ClassCastException 运
行期间 可能会出现这些错误
○checked异常:受检异常/检查异常 例如:FileNotFoundException
ClassNotFoundException ClassNotFoundException Java程序中人家认为这种异
常很可能出现,所以必须要提前解决!增强程序的健壮性!
•自定义异常:
/**
* 自定义异常(异常种类更加丰富 更加具体)
* author Raymond
* 2019年2月26日
*/
public class IllegalAgeException extends RuntimeException{
public IllegalAgeException(String message){
super(message);
}

    public IllegalAgeException(){
    
    }
 }

四、(目前作为了解)异常记录-日志(log4j)
•日志:(记录东西)在程序运行期间 记录程序的状态、用户操作行为、异常情况的一种
东西
• *.log
•日志是为了以后我们分析程序运行情况和解决问题的根据!重要!
•日志记录工具/框架:log4j(log for java) logback
1.下载jar包(人家编写的代码的字节码压缩包)
2.将jar包引入到你的工程内(先建立一个lib文件夹,将jar包放进去,右键jar包进行
build path)
3.像使用JRE内的类库一样去使用它即可
•info(); 记录普通信息的
•error(); 记录错误信息的
•debug(); 可以用来记录一下特别的普通信息的

•至于log4j配置文件的编写工作,可以自行查看提供的注释和文档