JAVA中异常重点总结

异常:

input.hasNextInt()   (判断用户通过控制台输入的是不是整数)

(Returns true if the next token in this scanner's input can be interpreted as an int value in the default radix using the nextInt method. The scanner does not advance past any input.)

 

System.exit(1);     (程序强制退出,需要一个int类型的值非0就会退出JAVA虚拟机)

(This method calls the exit method in class Runtime. This method never returns normally.)

 

System.err.println(“……”);     (输出一个错误的输出流,输出时会变成红色)

 

传统的方式类处理异常弊端:

  1. 代码臃肿
  2. 程序员要花很大精力“堵漏洞”
  3. 程序员很难堵住所有“漏洞”

 

扫描二维码关注公众号,回复: 2386268 查看本文章

解决办法:使用异常处理机制

异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

生活中,根据不同的异常进行相应的处理,而不会就此中断我们的生活

Java编程语言使用异常处理机制为程序提供了错误处理的能力

程序中预先设置好 对付异常的处理办法(程序运行) --》 异常(对异常进行处理) --》(处理完毕,程序继续运行)

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

捕获异常:

Try --》 执行可能产生 异常的代码

Catch --》 捕获异常

Finally --》 无论是否发生异常,代码总能执行

(这三个总在一起)

声明异常:

Throws --》 声明方法可能要抛出的各种异常(后面跟抛出异常的名字)

抛出异常:

Throw --》 手动抛出异常

 

使用try-catch块捕获异常,分为三种情况:

第一种情况:正常

(Try 后发现没产生异常,跳过catch,直接执行try-catch后面的代码块)

public void method(){

try {

      // 代码段(此处不会产生异常)

} catch (异常类型 ex) {

      // 对异常进行处理的代码段

}

// 代码段

}

例如:

try{

       ……

}catch(Exception e){

       System.err.println("出现了错误!");

       e.printStackTrace();

}

Exception e【异常对象e变量名随便取】

e.printStackTrace();【打印异常堆栈信息;printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程】

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 cn.jbit.exception.Test3.main(Test3.java:15) --》 出现异常的位置

在此方法中抛出了异常

(看异常信息时从下往上看,查错要从上往上找,一般是上面错导致了下面错)

 

第二种情况:出现异常(异常是一种特殊的对象,类型为java.lang.Exception或其子类)

(Try(产生异常) --》 产生异常对象 --》 异常类型匹配(进入catch块) --》 catch(程序继续执行) --》 try-catch块后的代码段)

public void method(){

try {

      // 代码段 1

      // 产生异常的代码段 2

      // 代码段 3

} catch (异常类型 ex) {

      // 对异常进行处理的代码段4

}

// 代码段5

}

 

Java中所有的异常都是Exception(父类)

除数为0的异常:ArithmeticException (子类)

输入格式不正确的异常:InputMismatchException (子类)

 

第三种情况:异常类型不匹配

(Try(产生异常)--》 产生异常对象 --》 异常类型匹配à程序中断运行)

public void method(){

try {

           // 代码段 1

           // 产生异常的代码段 2

           // 代码段 3

} catch (异常类型 ex) {

           // 对异常进行处理的代码段4

}

// 代码段5

}

 

总结:

try{

}catch(异常Exception或者Exception的子类){

}

  1. 无异常。Try --》 catch后面的代码
  2. 有异常,而且恰好和catch后面的异常类型匹配:try --》 catch里面的代码 --》 catch后面的代码
  3. 有异常,但是和catch后面的异常类型不匹配:try --》 中断

 

在catch块中处理异常

  1. 加入用户自定义处理信息:

System.err.println("……");

  1. 调用方法输出异常信息

e.printStackTrace();

  1. 异常对象常用的方法

void printStackTrace()【输出异常的堆栈信息】

String getMessage()【返回异常信息描述字符串(但是不是所有异常都有字符串提醒,没有的就显示null),是printStackTrace()输出信息的一部分】

 

异常总结:

异常

说明

Exception

异常层次结构的父类

ArithmeticException

算术错误情形,如以零作除数

ArrayIndexOutOfBoundsException

数组下标越界

NullPointerException

尝试访问null对象成员

ClassNotFoundException

不能加载所需的类

IllegalArgumentException

方法接收到非法参数

ClassCastException

对象强制类型转换出错

NumberFormatException

数字格式转换异常,如把"abc"转换成数字

InputMismatchException

输入类型不匹配

 

在try-catch块后加入finally块:

是否发生异常都执行

try(有异常)--》 (异常类型匹配)catch 块 --》 finally 块

(无异常)--》 finally 块

不执行的唯一情况:

(有异常)--》 catch 块(如果加上System.exit(1)) à finally不执行,中断程序,退出Java虚拟机

 

存在return的try-catch-finally块

public void method(){

try {

           // 代码段 1

           // 产生异常的代码段 2

} catch (异常类型 ex) {

           // 对异常进行处理的代码段3

          return;

}finally{

            // 代码段 4

}

}

try(有异常)--》 (异常类型匹配)catch 块 --》 finally 块 --》 执行return退出方法

try块中有return语句执行过程与此类似

 

多重catch块:

用于引发多种类型的异常:

  1. 排列catch 语句的顺序:先子类后父类
  2. 发生异常时按顺序逐个匹配
  3. 只执行第一个与异常类型匹配的catch语句

 

public void method(){

try {

           // 代码段

           // 产生异常(异常类型2)

} catch (异常类型1 ex) {

           // 对异常进行处理的代码段

} catch (异常类型2 ex) {

           // 对异常进行处理的代码段

} catch (异常类型3 ex) {

           // 对异常进行处理的代码段

}

// 代码段

}

try(有异常)--》 与异常类型1不匹配 --》 与异常类型2匹配(进入catch块) --》 (程序继续执行)try-catch 块后的代码段

 

小结:

  1. try-catch-finaIly结构中try语句块是必须的,catch、finally语句都是可有可无,但是两者至少出现之一
  2. try-catch块中存在return语句, finally块还执行
  3. try-catch- finally块中,finally块唯一不执行的情况是:catch 块如果存在System.exit(1);时不执行finally

 

声明异常:

如果在一个方法体中抛出了异常,如何通知调用者?

throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开

方式1:调用者处理异常

方式2:调用者继续声明异常(main()方法声明的异常由Java虚拟机处理)

 

public class Test7 {

       public static void divide() throws Exception {      --》 声明异常,多个异常用逗号隔开

                //可能出现异常的代码

       }

       public static void main(String[] args) {

               try {

                     divide();                            --》 方式1:调用者处理异常

               } catch (Exception e) {

                     e.printStackTrace();

               }

       }

}

public static void main(String[] args) throws Exception {   --》 方式2:调用者继续声明异常

        divide();                             --》 main方法声明的异常由Java虚拟机处理

}

 

除了系统自动抛出异常外,有些问题需要程序员自行抛出异常(使用throw拋出异常)

public class Person {

       private String name = "";   // 姓名

       private int age = 0;   // 年龄

       private String sex = "男";  // 性别

       public void setSex(String sex) throws Exception {

              if ("男".equals(sex) || "女".equals(sex))

                     this.sex = sex;

              else {

                     throw new Exception(“性别必须是\"男\"或者\"女\"!");      --》 抛出异常

              }

       }

}

public static void main(String[] args) {

       Person p = new Person();

 try {          --》 只要抛出异常之后,必须try-catch 或者声明异常(thows)

                     p.set.Sex(“boy”);  

               } catch (Exception e) {

                     e.printStackTrace();

               }

       }

}

 

除了系统自动抛出异常外,有些问题需要程序员自行抛出异常

throw与throws:

throw

throws

生成并抛出异常

声明方法内抛出了异常

位于方法体内部,可作为单独语句使用

必须跟在方法参数列表后面,不能单独使用

抛出一个异常对象,且只能是一个

声明抛出异常类型,可以跟多个异常

 

throws:声明异常,写在方法声明后,表示此方法会有异常产生

throw:抛出异常,throw new Exception(“提示信息”);

如果系统不能自动抛出异常,需要手动抛出异常

 

 

Checked异常:在编译时也会检查,出现时必须处理

 

当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类

使用自定义异常的步骤:

1. 定义异常类(继承Throwable类、继承Excepion 或者RuntimeException) à 2. 编写构造方法,继承父类的实现 à 3. 实例化自定义异常对象 à 4. 使用throw抛出

自定义异常:class xxx extends 异常类{

                            public xxx(String message)

                                   super(message);

}

 

异常链:

A方法调用B方法时,B方法却抛出了异常。

那A方法继续抛出原有的异常还是抛出一个新异常呢?

如果抛出原有的异常:

A方法与B方法进行了关联,不便于代码的修改和扩展

如果抛出新的异常:

丢失原有的异常信息

 

(而异常链创建了新的异常但却保留了原有异常的信息)

 

异常处理原则:

  1. 异常处理与性能
  2. 异常只能用于非正常情况
  3. 不要将过于庞大的代码块放在try中
  4. 在catch中指定具体的异常类型
  5. 需要对捕获的异常做处理

 

异常总结:

try{

}

catch(异常类 对象名){

异常处理

e.getMessage();

e.printStackTrace();

}

finally{

一定要执行的代码,如果遇到return,先执行finally,再执行return;如果遇到System.exit(1);直接退出程序,不执行finally

}

throws:声明异常,写在方法声明后,表示此方法会有异常产生

throw:抛出异常,throw new Exception("提示信息");

如果系统不能自动抛出异常,需要手动抛出异常

自定义异常:class xxx extends 异常类{}

 

Throwable父类

Error:ThreadDeath,AWTError非程序能够恢复的异常

Exception:RuntimeException运行时异常(不需要必须处理的异常),checked异常(SQLException,ClassNotFoundException):必须处理的异常

 

日志(log):

  1. 主要用来记录系统运行中一些重要操作信息
  2. 便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因

 

日志分类:SQL日志、异常日志、业务日志

 

log4j是一个非常优秀的开源日志记录工具

  1. 控制日志的输出级别
  2. 控制日志信息输送的目的地是控制台、文件等
  3. 控制每一条日志的输出格式

 

使用log4j记录日志步骤:

1. 在项目中加入log4j的JAR文件 --》 2. 创建log4j.properties文件 --》 3. 配置日志信息 --》 4. 使用log4j记录日志信息

 

  1. 只有jar包需要build path
  2. build path后的jar包到reference Libraries,呈现出包名和类名.class引用这些包和类Logger
  3. 文件的默认路径为项目的根路径log4j.properties
  4. 后缀是properties本身是记事本文件,内容格式name=value
  5. log4j. properties文件内容:输出目标:控制台,日志文件

stdout:控制台     logfile:文件

XXXXLayout:输出的布局格式:

有:Simplelayout,HTMILayout,TTCCLayout,Patternslayout:%d %m %l %p %n

  1. 导入文件:PropertyConfiguration(“文件名”);

org. apache. log4j. XXX

 

猜你喜欢

转载自blog.csdn.net/baidu_29343517/article/details/81191403