异常处理

1.不使用异常机制的弊端
  01.代码臃肿
  02.程序员要花很大精力“堵漏洞”
  03.程序员很难堵住所有“漏洞”
  04.对代码的修改极其不利

2.异常机制
  01. 异常
    程序的运行过程中所发生的不正常的事件,它会中断正常运行的程序。
  02.Java编程语言使用异常处理机制为程序提供了错误处理的能力
    程序中异常处理步骤:
      001.程序中预先设置好对付异常的处理办法
      002.程序运行
      003.异常
      004.对异常进行处理
      005.处理完毕,程序继续运行

3.Java的异常处理是通过5个关键字来实现
  01.try
    执行可能产生异常的代码
  02.catch
    捕获异常
  03.finally
    无论是否发生异常,代码总能执行
  04.throw
    手动抛出异常
  05.throws
    声明方法可能要抛出的各种异常
  语法:
    try{
      //可能出现异常的代码段
     }catch(异常类型(Exception) ex){

      //对异常进行处理的代码段
     }fanilly{
      //代码段
     }
      *异常是一种特殊的对象,类型为java.lang.Exception或其子类

4.编译器的异常抛出
  Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:840)
  at java.util.Scanner.next(Scanner.java:1461)
  at java.util.Scanner.nextInt(Scanner.java:2091)
  at java.util.Scanner.nextInt(Scanner.java:2050)
  at Demo01.main(Demo01.java:7)

    01.Exception in thread "main" java.util.InputMismatchException
      *抛出的是异常的类型
     02.at Demo01.main(Demo01.java:7)
      001.main:在此方法中抛出了异常
      002.(Demo01.java:7):异常抛出的位置

5.异常类中常用的方法
  01.printStackTrace()
    抛出异常的内存堆栈信息及错误的位置
      *输出异常的堆栈信息
  02.getMessage()
    抛出异常信息
      *返回异常信息描述字符串,是printStackTrace()输出信息的一部分

6.常见的异常类型
  01.Exception
    异常层次结构的父类
  02.ArithmeticException
    算术错误情形,如以0作除数
  03.ArrayIndexOutOfBoundsException
    数组下标越界
  04.NullPointerException
    尝试访问null对象成员
  05.ClassNotFoundException
    不能加载所需的类
  06.IllegalArgumentException
    方法接收到非法参数
  07.ClassCastException
    对象强制类型转换出错
  08.NumberFormatException
    数字格式转换异常,如把“abc”转换成数字

7.Java中继承的关系
  01.Object(异常类的顶级父类)
    001.Error(程序无法处理的错误(非检查异常))
    002.Exception(程序可处理的异常)
      0001.非查询异常
        00001.RuntimeException
        00002.ArrayIndexOutOfBoundsException
        00003.ArithmeticException
        00004.NumberFormatException
        00005.NullPointerException
      0002.非运行异常(检查异常)
        00001.IOException
        00002.EoFException
        00003.FileNotFoundException
        00004.SQLException
        00005.ClassNotFoundException

8.生成异常语句
  01.快捷方法
    001.选中代码
    002.Alt + Shift + Z
  02.手动
    001.选中代码
    002.右键 → surround With → try(try catch block)

9.程序退出
  01.System.exit()
    001.带参方法
      参数为0是程序正常退出
      参数非0是程序强制退出(关闭Java虚拟机)

10.小结
  01.try-catch块中存在return语句,是否执行finally块,如果执行,执行顺序
    执行顺序:
      try ---> catch ---> finally ---> return
  02.try-catch-finally块中,finally块唯一不执行的情况
    使用System.exit()方法,因为会关闭Java虚拟机

11.总结
  01.异常分为Checked异常和运行时异常
    001.Checked异常必须捕获或者声明抛出
    002.运行时异常不要求必须捕获或者成名抛出
  02.try-catch-finally中存在return语句的执行顺序
    try ---> catch ---> finally ---> return
  03.finally块中语句不执行的情况
    出现了System.exit()语句!

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          异常日志

1.throws(系统自动抛出异常)
  01.语法
    访问修饰符 返回值类型 方法名() throws Exception{

    }
  02.声明异常,抛给调用这处理。
    *调用者必须使用try-catch进行处理
  03.位置
    方法名后面进行声明异常,多个异常使用逗号隔开

2.throw(手动抛出异常)
  01.语法:
    throw new Exception(抛出的内容!!);
  02.手动抛出异常处理方式
    001.使用try-catch语句在方法中处理
    002.使用throws抛给调用者,让调用者使用try-catch语句处理异常

3.异常的分类
  01.Throwable
    001.Error
      仅靠程序本身无法恢复的严重错误
      如:
        0001.AWTError
        0002.ThreadDeath
        ..........
    002.Exception
      由Java应用程序抛出和处理的非严重错误
        0001.SQLException
        0002.ClassNotFoundException
        .......
          *Checked异常,程序必须处理该类异常
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      0001.RuntimeException(运行时异常,不要求程序必须做出处理)
      00001.ArithmeticException(运行时异常)
      00002.NullPointerException(空指针异常)
      00003.NumberFormatException(格式转换异常)
      ............

4.throw和throws的区别
  01.throw
    001.一次只能抛出一个异常
    002.使用try-catch语句进行处理
  02.throws
    001.一次可以抛出多个异常
    002.处理方式
      0001.使用try-catch语句进行处理
      0002.使用throws抛给调用者,让调用者使用try-catch语句处理异常
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      开源日志记录log4j工具

1.使用log4j记录程序运行的过程,存储起来,方便后期查看

2.日志及分类
  01.日志(log)
    主要用来记录系统运行在一些重要操作信息,便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因
  02.日志分类
    SQL日志、异常日志、业务日志
  03.log4j时一个非常优秀的开源日志记录工具
    001.控制日志的输出级别
    002.控制日志信息传输的目的地时控制台、文件等
    003.控制每一条日志的输出格式
3.使用log4j记录日志步骤
  01.在项目中加入log4j的JAR文件
  02.创建log4j.properties文件
  03.配置日志信息
  04.使用log4j记录日志信息

4.详细步骤
  01.添加JAR包
    001.提前准备好JAR包
    002.在工程中选中相应的工程(右键)→Properties(选择)→ Java Build Path(选择)→ Libraries(选择)→ Add External JARs....(选择)→找到预先准备好的JAR包 → 打开 → OK
  02.编写Log4j代码
    001.右键添加file文件。
      *文件名后缀名为(properties)
      *log4j中的注释为(##)
      *添加到src目录下
  03.使用日志文件
    001.使用org.apache.log4j.Logger包下的Logger类
    002.使用Logger类下的Info方法
  04.示例
    public class Test {
      static Logger lo = Logger.getLogger(""); //logger类不可以实例化
    public static void main(String[] args) {
      lo.info("1232"); //方法入参Object(Log4j写入的内容)
      }
    }

  05.Log4文j配置

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=本地路径
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout,file

    *路径需要修改为本地

5.log4j来源
  4:for