本文参加了思否技术征文,欢送正在浏览的你也退出。
异样
异样的概述
- 异样就是不失常的意思,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("产生异样的成果"); } @Override public 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("完结"); } @Override public 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 则肯定抛出了某种异样