本文参加了思否技术征文,欢送正在浏览的你也退出。
异样
异样的概述
- 异样就是不失常的意思,Java语言中次要是指程序在运行阶段产生的谬误
Throwable(可抛出的,可扔出的)
- java.lang.Throwable 类是Java程序所有谬误或异样的超类
次要有两个字类
Error
- Error次要形容比较严重的谬误
- 无奈通过编程来解决的重大的谬误
Exception
- Exception次要m形容比拟轻量级的谬误
- 能够通过编程来解决
Exception类的次要分类
RuntimeException -> 运行时异样,也叫非检测性异样类
- 非检测性异样类就是指b编译阶段无奈被编译器检测进去的异样
次要子类
- ArithmeticException -> 算数异样类
- ArrayIndexOutOfBoundsException(间接子类) -> 数组下标异样类
- NullPointerException -> 空指针异样
- ClassCastException -> 类型转换异样
- NumberFormatException(间接子类)-> 数字格局异样
留神
- 当程序的执行过程中产生异样,若没有手动进行解决,则由Java虚拟机采纳默认的形式进行解决,默认形式是打印异样名称、异样起因以及异样产生的地位并终止程序,后序代码无奈被执行
IOException和其余异样类 -> 其余异样类,也叫做非检测性异样
案例
TestRuntimeException.java
package demo1;import java.io.IOException;import java.io.FileInputStream;import java.io.FileNotFoundException;/* * ArithmeticException -> 算数异样类 ArrayIndexOutOfBoundsException(间接子类) -> 数组下标异样类 NullPointerException -> 空指针异样 ClassCastException -> 类型转换异样 NumberFormatException(间接子类)-> 数字格局异样 */public class TestRuntimeException { public static void main(String[] args) { // 察看检测性异样 // FileInputStream fis = new FileInputStream("c:/a.txt"); // java.lang.ArithmeticException 算数异样 int a = 10; int b = 0; if (b != 0) { System.out.println(a/b); } // java.lang.ArrayIndexOutOfBoundsException 数组下标越界异样 int[] arr = new int[3]; int num = 3; if (num >= 0 && num < arr.length) { System.out.println(arr[num]); } // java.lang.NullPointerException String str = null; if (str != null) { System.out.println(str.length()); } // java.lang.ClassCastException Exception ex = new Exception(); if (ex instanceof IOException) { IOException ie = (IOException) ex; } // java.lang.NumberFormatException String s = "12be"; if (s.matches("\\d+")) { System.out.println(Integer.parseInt(s)); } System.out.println("运行程序完结"); }}
异样解决
运行时异样的解决形式
- 对于绝大数运行时异样来说,都能够通过条件判断防止异样的产生
异样的捕捉
语法格局
try{ 可能产生异样对象的语句块 }catch(异样类型 援用名){ 针对以后异样类型对象的解决语句块 } .... (能够写多个catch) finally{ 无论是否产生异样,都应该执行的语句块 }
注意事项
- 当捕捉的构造中有多个catch分支时,切记小范畴的异样类型放在大范畴的异样类型下面
- 懒人写法:
catch(Exception e) {....}
- 执行流程
try { a; b; // 可能产生异样的语句 c; } catch (Exception e) { e; } finally { f; } - 当没有产生异样的时候,程序的执行流程是:a b c f - 当产生异样时,程序的执行流程是: a b e f
案例
TestExceptionCatch.java
package demo2;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class TestExceptionCatch {public static void main(String[] args) { // 申明援用指向本类的对象,用于读取文件中的内容 FileInputStream fis = null; try { // 随时可能产生文件找不到y异样对象, new FileNotFoundException() fis = new FileInputStream("d:/a.txt"); } catch (FileNotFoundException e) { // 打印异样的名称、异样起因、异样的地位等信息 e.printStackTrace(); } try { fis.close(); } catch (IOException e) { e.printStackTrace(); } catch (NullPointerException e) { // System.out.println("输入"); e.printStackTrace(); }}}
TestFinally.java
package demo3;public class TestFinally {public static void main(String[] args) { int a = 10; int b = 0; try { System.out.println(a/b); } catch (Exception e) { e.printStackTrace(); return ; } finally { System.out.println("无论是否产生异样都会执行"); } System.out.println("程序完结");}}
java.lang.ArithmeticException: / by zero
无论是否产生异样都会执行
at demo3.TestFinally.main(TestFinally.java:9)
异样的抛出
基本概念
- 某些非凡的场合中,当产生异样后却无奈间接解决/不想解决时,此时就能够将异样转移给以后办法的调用者,这就叫异样的抛出
语法格局
- 返回值类型 办法名称(形参列表) throws 异样类型{....}
办法重写的准则
- 要求办法名雷同、参数列表雷同、返回值类型也雷同,从jdk1.5开始容许返回子类类型
- 范畴权限不能变小,能够雷同或者变大
- 不能抛出更大的异样
留神
- 子类中重写当前的办法能够抉择抛出与父类一样的异样、更小的异样、不抛出异样,然而不能抛出更大的异样、不同的异样
案例
A.javapackage demo4;import java.io.IOException;public class A { public void show() throws IOException{ System.out.println("A"); }}
SubA.java
package demo4;import java.io.IOException;import java.io.FileNotFoundException;import javax.print.PrintException;public class SubA extends A{ @Override // public void show() throws IOException { // public void show() throws FileNotFoundException { // public void show() throws PrintException { // public void show() throws Exception { public void show() { }}
显然不能抛出更大的异样
自定义异样
自定义异样的由来
- Java官网库中尽管提供了大量的异样类,但不足以形容现实生活中所有的异常情况。当呈现官网库中没有m形容的异常情况,这个时候就须要程序员自定义异样类加以形容,使得异样信息更加具备针对性和可读性
自定义异样的流程
- 自定义类继承自Exception类或者Exception类的子类
- 提供两个版本的构造方法,一个是无参构造方法,另一个是字符串做参数的构造方法
自定义异样 -- >案例1
Person.java
package demo5;public class Person {private String name;private int age;public Person() { super();}public Person(String name, int age) throws Exception { super(); setName(name); setAge(age);}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getAge() { return age;}public void setAge(int age) throws Exception { if(age > 0 && age < 150) { this.age = age; } else { // System.out.println("年龄不合理"); // 手动产生一个异样对象并抛出 // throw new Exception(); throw new AgeException("年龄不合理!"); } System.out.println("产生异样的成果");}@Overridepublic String toString() { return "Person [name=" + name + ", age=" + age + "]";}}
AgeException.java
package demo5;public class AgeException extends Exception {/** * */private static final long serialVersionUID = 1L;// 自定义无参的构造方法public AgeException() { }// 自定义应用字符串作为参数的构造方法public AgeException(String msg) { super(msg);}}
TestPerson.java
package demo5;public class TestPerson {public static void main(String[] args) { Person p = null; try { p = new Person("张三", -12); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(p);}}
demo5.AgeException: 年龄不合理!
null
at demo5.Person.setAge(Person.java:33)
at demo5.Person.<init>(Person.java:15)
at demo5.TestPerson.main(TestPerson.java:8)
自定义异样 -- > 案例2
Student.java
package demo6;public class Student {private String name;private int id;public Student() { super();}public Student(String name, int id) throws IDException { super(); setName(name); setId(id);}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getId() { return id;}public void setId(int id) throws IDException { if (id > 0) { this.id = id; } else { // System.out.println("学号不合理"); throw new IDException("学号不合理"); } System.out.println("完结");}@Overridepublic String toString() { return "Student [name=" + name + ", id=" + id + "]";}}
IDException.java
package demo6;public class IDException extends Exception {/** * */private static final long serialVersionUID = 1L;public IDException() { }public IDException(String msg) { super(msg);}}
TestStudent.java
package demo6;public class TestStudent {public static void main(String[] args) throws IDException { /*Student stu = null; try { stu = new Student("小王", -5); } catch (IDException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ Student stu = new Student("小王", -5); System.out.println(stu);}}
Exception in thread "main" demo6.IDException: 学号不合理
at demo6.Student.setId(Student.java:30)
at demo6.Student.<init>(Student.java:14)
at demo6.TestStudent.main(TestStudent.java:14)
此处有一点要留神,在案例一的TestPerson中,在main函数中,咱们应用try....catch语句,异样由外部进行解决,会打印前面的语句
而在案例二的TestStudent中,咱们将异样间接交给main函数解决,也就是交给虚拟机解决,所以并不会执行前面的语句
异样对象的抛出
- throw new 异样类型()
例如:
- throw new Exception()
最初简略介绍一下throws和throw的区别
throws和throw的区别
throws
- 用在办法申明前面,跟的是异样类名
- 能够跟多个异样类名,用逗号隔开
- 示意抛出异样,由该办法的调用者来解决
- throws示意出现异常的一种可能性,并不一定会产生这些异样
throw
- 用在办法体内,跟的异样对象名
- 只能抛出一个异样对象名
- 示意抛出异样,由办法体内的语句实现
- throw则是抛出了异样,执行throw则肯定抛出了某种异样