zoukankan      html  css  js  c++  java
  • 异常

    1.理解异常

      1.1 什么是异常

    异常是程序在运行过程中发生的不正常的事件,影响程序的执行。

    比如:所需的文件找不到,网络连接中断或不通,算数运算出错,数组小标越界等

      1.2 什么是异常处理

    异常处理就是对发生的异常做出的补救措施,一些处理的办法,万一发生异常,使用这些措施保证程序的正常运行。

    2.异常处理

      2.1 异常处理的关键字

    Try ; catch; finally; throw; throws

     2.2 异常关键字的属性

         1try-catch

    A:如果try块中所有语句都正常执行完毕,不会放生异常,那么catch快中的所有语句都会被忽略。

    B:如果try快中有异常,并且这个异常与catch块中的异常类型相匹配,将指向catch块中的语句,try异常语句之后的代码将被忽略(跳过)。

    C:如果try语句有异常,而抛出的异常在catch块中没有声明,则程序立刻退出。

         2catch快中输出异常信息的方法

    Void printStackTrace();输出异常的堆栈信息。

    String getMessage(); 返回异常信息描叙字符串。是Void printStackTrace();输出异常的堆栈信息的一个详细部分

         3try-catch-finally

    A:无论是否发生异常,finally块中的语句都会被执行。

    Btry-catch-finally结构中的块try块是必须的,catchfinally块为可选,但是两者至少出现其中之一。

    C:即使try块中有return语句,finally语句也会被执行,执行完finally语句后才会执行try语句或catch语句中的return语句退出方法。

    Dfinally块不被执行的唯一情况,在异常处理代码中执行System.exit(1)

         4)多重catch

    在一个try语句后面跟多个catch块可以分别处理不同的异常,但是排列顺序必须从子类到父类,最后一般都是Exception类,如果Exception类放在子类的前面,后面子类将不会被执行。

         5)声明异常 throws

    Java中通过关键字throws声明某个方法可能抛出的各种异常,throws可以同时声明多个异常,之间用逗号隔开

         6)抛出异常 throw

    java中可以使用throw关键字来自行抛出异常

         7throwthrows的区别:

    A:作用不同:throw用于在程序中抛出异常;throws用于声明方法内抛出了异常类型

    B:使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表后面,不能单独使用。

    C:内容不同:throw抛出一个异常对象,而且只能是一个;throws抛出异常类,而且可以是多个异常类。

      3.处理异常的方式

    A:通过try-catch捕获并处理异常。

    B:通过throws继续声明异常,如果调用者不打算处理该异常,则可以继续通过throws声明 异常类,让上一级调用者处理。Main()方法声明的异常将有java虚拟机来处理。

    3.异常的分类

    一是:Error

    程序本身无法恢复的严重错误。非重点,如虚拟机错误,内存溢出动态链接失败。

    二是:Exception

    java应用程序抛出和处理的非严重错误,主要包括:运行时异常(RunTimeException)和 非运行时异常(checked

    @1:RunTimeException

    出现异常仍可以编译和运行 主要包括:

      1.ArithmeticException 算数错误异常类;如除数为0

      2.ArrayIndexOfBoundsException 数组下表越界

      3.)NullPointerException 对象为空(空指针)

      5.InputMismatchException 欲得到的数据类型和实际输入的不匹配

      6.IllegalArgumentException 方法接受到非法的参数,实参类型不对

      7.ClassCastException 对象强制类型转换出错

      8.NumberFormatException 数字格式转换异常 比如把“abc”转换成数字

      9.)ArrayStoreException(数据存储异常,操作数组时类型不一致)

      @2:Checked

    非运行时异常类,程序必须捕获或抛出这种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:一,通过try-catch在当前位置捕获并且处理异常;二,通过throws声明抛出异常类,交给上一级调用方法处理。主要包括:

    .ClassNotFoundException 不能加载所需要的类

    4.开源日志记录工作log4j

      4.1 日志记录的分类

    SQL日志:记录执行系统执行SQL的语句

    异常日志:记录系统运行中发生的异常事件

    义务日志:记录系统运行过程,如用户从操作,操作记录

      4.2 使用log4j的步骤

    在项目中加入log4j所使用的JAR文件

    创建log4j.properties文件

    编写log4j.properties文件,在log4j.properties文件里source里面编写,配置日志信息

    在程序中使用log4j记录日志信息

      4.3 log4j的使用语法实例

         4.3.1 编写log4j.properties文件:

        #设置logger输出级别和输出目的#

    log4j.rootLogger=debug,stout,logFile

    #把日志信息输出到控制台#

    log4j.appender.stout=org.apache.log4j.ConsoleAppender

    log4j.appender.stout.Target=System.err

    log4j.appender.stout.layout=org.apache.log4j.SimpleLayout

    #把日志信息输出到文件:jbit.log#

    log4.appender.logFile=org.apache.log4j.FileAppender

    log4.appender.logFile.File=jbit.log

    log4.appender.logFile.layout=org.apache.log4j.PatternLayout

    log4.appender.logFile.layout.ConversionPattern=%d{YYYY-MM-DD HH:mm:ss}%1 %F %p %m%n

          4.3.2 在程序中使用log4j记录日志信息

    package cn.shortAnswer5;

    import org.apache.log4j.Logger;

    import cn.shortAnswer2.Test;

    public class Tset {

    public static Logger logger=Logger.getLogger(Test.class.getName());

    /**

     * @param args

     */

    public static void main(String[] args) {

    int[] array=new int[2];

    try {

    array[2]=5;

    } catch (ArrayIndexOutOfBoundsException e) {

    System.err.println("数组下标越界");

    logger.debug(e);

    e.printStackTrace();

    }

    }

    }

        4.4 日志的输出级别及属性

    Fatal:指严重的错误事件会导致应用程序的退出

    error:指虽然发生错误事件,但仍然不影响系统的继续运行。

    Warn:表明会出现潜在错误的情形

    Info:在粗粒度级别上指明消息,强调程序的运行过程。

    Debug:指出细粒度的信息事件,对调试应用程序非常有帮助。

           4.4.1 各个输出级别的优先级:

    Fatal>error>warn>info>dubug

           4.4.2 日志输出目的地Appender

    Log4j.rootLogger=debug,stdout,logfile

    其中stdout,logfile指日志输出目的地的名字,可以随便起。

    Log4j日志允许输出到多个目的地,一个输出目的地称为一个Appender,最常用的有两种:

     AConsoleAppender:输出日志到控制台。通过Target属性配置输出到System.outSystem.err,默认是System.out

     BFileAppender;输出日志到一个文件。通过file属性配置文件的路径及名称。

           4.4.3 日志布局类型layout

    Appender类必须使用一个与之相关联的布局类型Layout,用来指定它的输出样式,常见的样式有三种:

    AHTMLLayout;格式化日志输出为HTML表格。

    BSimpleLayout;以一种简单的格式输出,它输出的级别是level,然后跟着一个破折号“-----”最后是日志信息。

    CPatternLayout;根据指定的转换格式输出。需要配置layout.ConversionPattern属性,如果没有将会使用默认的转换样式。

          4.4.4 转换模式ConversionPattern

    %p: 输出日志信息优先级,即DEBUGINFOWARNERRORFATAL, 
    %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921 
    %r: 输出自应用启动到输出该log信息耗费的毫秒数 
    %c: 输出日志信息所属的类目,通常就是所在类的全名 
    %t: 输出产生该日志事件的线程名 
    %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。 
    %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 
    %%: 输出一个"%"字符 
    %F: 输出日志消息产生时所在的文件名称 
    %L: 输出代码中的行号 
    %m: 输出代码中指定的消息,产生的日志具体信息 
    %n: 输出一个回车换行符,Windows平台为" "Unix平台为" "输出日志信息换行 .

  • 相关阅读:
    MySQL实现了四种通信协议
    深入了解Windows句柄到底是什么
    Linux虚拟地址空间布局以及进程栈和线程栈总结
    malloc 函数详解
    数组指针和指针数组的区别
    Linux中sudo配置
    ctrl+c,ctrl+d,ctrl+z在linux程序中意义和区别
    linux select函数详解
    linux grep命令详解
    Linux find 用法示例
  • 原文地址:https://www.cnblogs.com/Eason-chen/p/7642535.html
Copyright © 2011-2022 走看看