java之异常处理(Exception)

Posted 西嘻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java之异常处理(Exception)相关的知识,希望对你有一定的参考价值。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

知识点:异常:java.lang.Throwable(Error/Exception(RuntimeException/其他检查异常类))   

java中的异常处理
  java.lang.Throwable所有异常类和错误类的父类
    --java.lang.Error类:程序运行过程中出现的致命的,严重的错误,无法通过异常处理使程序正常执行。
    --java.lang.Exception类:是所有异常类的父类
java中的异常可以分为两类:
  1.运行时异常:不捕获也可以通过编译。
    ArithmeticException:算术错误情形,如以零作除数
    ArrayIndexOutOfBoundsException:数组下标越界
    NullPointerException:(空指针异常)尝试访问 null 对象成员
    ClassCastException:类型转换异常,主要在强制转换时发生
    NumberFormatException:数字转换异常
    ....
  2.检查异常:必须捕获否则无法通过编译
    ClassNotFoundException:类找不到(类无法加载)异常
    IOException:IO异常
    ....

传统的解决方案:利用if进行判断来堵漏洞(麻烦)
  异常:程序在执行过程中遇到特殊的事件,导致程序中断执行。
java中的异常处理: try,catch,finally,throws,throw
  * 1.try...catch
  * try{
  * //可能出现异常的代码
  * }catch(异常类型 e){
  * //处理异常的代码
  * }
  执行过程:当try中代码出现异常时,将会抛出一个异常对象,
  * 该异常对象会和catch中异常类型进行匹配,如果匹配成功将执行catch中的代码,否则程序中断执行。
异常对象中常用的方法
  * printStackTrace():打印异常堆栈跟踪信息(类,消息和异常跟踪信息)
  * toString():异常信息(类和消息)
  * getMessage():异常消息(异常消息)

try...catch...catch结构:
  语法:
    * try{
    * //可能出现异常的代码
    * }catch(异常类型1 e){
    * //处理异常类型1的代码;
    * }catch(异常类型2 e){
    * //处理异常类型2的代码;
    * }...
  执行过程与多重的if...else if条件分支类似,如果try中的代码发生的异常,将抛出一个异常对象,
  * 该异常对象会catch中的异常类型挨个进行匹配,如果匹配成功将执行catch块中的处理代码。
  注意:异常类型的范围应该是有小到大,否则会导致其下的catch中的代码不会执行。

try...catch...catch...finally....

Eg:

 1 package cn.zzsxt.exception3;
 2 
 3 import java.util.InputMismatchException;
 4 import java.util.Scanner;
 5 
 6 public class TestPractice {
 7     public static void main(String[] args) {
 8         /*
 9          按照控制台提示输入1~3之间任一个数字,程序将输出相应的课程名称
10         根据键盘输入进行判断。如果输入正确,输出对应课程名称。如果输入错误,给出错误提示
11         不管输入是否正确,均输出“欢迎提出建议”语句
12          */
13         System.out.println("请输入课程代号(1~3中任意的数):");
14         Scanner input = new Scanner(System.in);
15         try{
16             String str = input.next();
17             int num = Integer.parseInt(str);//把str转换成int类型的数值
18             if(num==1) {
19                 System.out.println("C#编程");
20             }else if(num==2) {
21                 System.out.println("Java编程");
22             }else if(num==3) {
23                 System.out.println("SQL编程");
24             }else {
25                 System.out.println("请输入1~3之间的数字!");
26             }
27         }catch(InputMismatchException e) {
28             System.out.println("输入的数据类型不匹配!");
29         }finally {
30             System.out.println("欢迎提出建议!");
31         }
32     }
33 }

 throws和throw关键字:
  * throws:在声明方法时声明该方法存在的异常。
  * throw:在方法内部抛出异常。
throws和throw的区别:
  * 1.位置不同: throws在方法声明名用于声明该方法存在的异常,throw在方法内部用于抛出异常。
  * 2.类型不同: throws后边跟的是异常类型,throw后边的异常对象
  * 3.作用不同: throws的作用是告知方法的调用者该方法存在某种异常类型需要处理,

  throw的作用:用于抛出某种具体的异常对象。

  throws的作用:声明方法可能抛出的异常类型。
  注意:经常throws和throw结合使用。

 1 package cn.zzsxt.exception4;
 2 
 3 import java.util.Scanner;
 4 /**
 5  * throws和throw关键字.
 6  * throws:在声明方法时声明该方法存在的异常。
 7  * throw:在方法内部抛出异常。
 8  * throws和throw的区别:
 9  * 1.位置不同: throws在方法声明名用于声明该方法存在的异常,throw在方法内部用于抛出异常。
10  * 2.类型不同: throws后边跟的是异常类型,throw后边的异常对象
11  * 3.作用不同: throws的作用是告知方法的调用者该方法存在某种异常类型需要处理,
12  *              throw的作用在用于抛出某种具体的异常对象。
13  * 经常throws和throw结合使用。
14  */
15 public class TestThrows {
16     public static int divide() throws ArithmeticException {
17         System.out.println("输入被除数:");
18         Scanner input = new Scanner(System.in);
19 /*        try{
20             int num1 = input.nextInt();
21             System.out.println("输入除数:");
22             int num2 = input.nextInt();
23             int num3 = num1/num2;
24             return num3;            
25         }catch(ArithmeticException e) {
26             throw new ArithmeticException();//抛出异常
27         }*/
28         
29         int num1 = input.nextInt();
30         System.out.println("输入除数:");
31         int num2 = input.nextInt();
32         int num3 = num1/num2;
33         return num3;            
34     }
35     
36     public static void main(String[] args) {
37         try{
38             int num = divide();
39             System.out.println("num="+num);
40         }catch(ArithmeticException e) {
41             System.err.println("除数不能为零!");
42         }
43     }
44 }

检查异常必须进行处理,否则无法通过编译。

常见的检查异常:
  *ClassNotFoundException:类找不到异常。
  *SQLException:操作SQL语句出现的异常信息
  *IOException:操作IO流出现的异常信息
  *....

Eg:

 1 package cn.zzsxt.exception4;
 2 /**
 3  *检查异常必须进行处理,否则无法通过编译。
 4  *常见的检查异常:
 5  *ClassNotFoundException:类找不到异常。
 6  *SQLException:操作SQL语句出现的异常信息
 7  *IOException:操作IO流出现的异常信息 
 8  *....
 9  *捕获检查异常的快捷键:1.选中出现检查异常的代码
10  *                 2.alt+shift+z
11  *
12                    .-‘ _..`.
13                   /  .‘_.‘.‘
14                  | .‘ (.)`.
15                  ;‘   ,_   `.
16  .--.__________.‘    ;  `.;-‘
17 |  ./               /
18 |  |               / 
19 `..‘`-._  _____, ..‘
20      / | |     | |\ 21     / /| |     | | \ 22    / / | |     | |  \ 23   /_/  |_|     |_|   \_24  |__\  |__\    |__\  |__25  */
26 
27 public class TestChecked {
28     public static void main(String[] args) {
29         try {
30             Class.forName("java.lang.String");
31         } catch (ClassNotFoundException e) {
32             e.printStackTrace();
33         }
34         
35         try {
36             int num = 4/0;
37         } catch (Exception e) {
38             e.printStackTrace();
39         }
40     }
41 }

自定义异常:如果JDK中异常类型无法满足程序需要。
  步骤:
    * 1.编写自定义异常类:继承Exception或RuntimeException
    * 2.编写构造方法,继承父类的实现(把自定义的异常消息传给父类)
    * 3.实例化自定义异常对象
    * 4.使用throw抛出

Eg:

 1 package cn.zzsxt.exception5;
 2 /**
 3  * 自定义异常:如果JDK中异常类型无法满足程序需要。
 4  * 步骤:
 5  * 1.编写自定义异常类:继承Exception或RuntimeException
 6  * 2.编写构造方法,继承父类的实现
 7  * 3.实例化自定义异常对象
 8  * 4.使用throw抛出
 9  */
10 public class SexException extends Exception{
11     public SexException(String message) {
12         super(message);
13     }
14 }
 1 package cn.zzsxt.exception5;
 2 /**
 3  * 自定义异常:如果JDK中异常类型无法满足程序需要。
 4  * 步骤:
 5  * 1.编写自定义异常类:继承Exception或RuntimeException
 6  * 2.编写构造方法,继承父类的实现
 7  * 3.实例化自定义异常对象
 8  * 4.使用throw抛出
 9  */
10 public class AgeException extends RuntimeException{
11     public AgeException(String message) {
12         super(message);//调用父类RuntimeException的构造方法,把自己定义的异常消息传给父类
13     }
14 }
 1 package cn.zzsxt.exception5;
 2 
 3 public class Student {
 4     private String name;
 5     private int age;
 6     private String sex;
 7     
 8     public Student() {
 9         super();
10         // TODO Auto-generated constructor stub
11     }
12 
13     public Student(String name, int age, String sex) {
14         super();
15         this.name = name;
16         this.age = age;
17         this.sex = sex;
18     }
19 
20     public String getName() {
21         return name;
22     }
23 
24     public void setName(String name) {
25         this.name = name;
26     }
27 
28     public int getAge() {
29         return age;
30     }
31 
32     public void setAge(int age) throws AgeException{
33         if(age>=1&&age<=100) {
34             this.age = age;
35         }else {
36             throw new AgeException("年龄必须在1~100之间的数!");
37         }
38     }
39 
40     public String getSex() {
41         return sex;
42     }
43 
44     public void setSex(String sex) throws SexException{
45         if(sex.equals("")||sex.equals("")){
46             this.sex = sex;
47         }else {
48             throw new SexException("性别必须是男或者是女!");
49         }
50         
51     }
52 
53     @Override
54     public String toString() {
55         return "Student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
56     }
57     
58     
59 }
 1 package cn.zzsxt.exception5;
 2 
 3 public class TestMyException {
 4     public static void main(String[] args) {
 5         Student stu = new Student();
 6         stu.setName("zhangsan");
 7         try {
 8             stu.setAge(200);
 9             stu.setSex("");
10         } catch (SexException e) {
11             System.err.println(e.getMessage());
12         } catch (AgeException e) {
13             System.err.println(e.getMessage());
14         } finally{
15             System.out.println("学生信息:"+stu);
16         }
17     }
18 }

 

=====================================================================================================


























































以上是关于java之异常处理(Exception)的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 异常处理

异常和TCP通讯

java之异常处理

Java面向对象之异常(异常处理方式)

Dart学习-- Dart之异常处理

Java之运行时异常与编译时异常区别