JAVA异常概述:
在使用计算机语言进行开发时,即使程序猿把代码写的尽善尽美,在系统的运行过程中仍然会遇到一些问题,比如用户错误输入格式,读取文件是否存在,网络是否通畅。这时候就会用到异常这个概念。
异常:
异常是指在程序运行过程中遇到的非正常情况,若不处理最终会导致JVM的非正常停止
异常指的并不是语法错误。语法错误,编译不会通过,不会产生字节码文件,根本不能运行
异常的抛出机制:
java中把不同的异常用不同的类表示,一旦发生某种异常就创造该异常类型的对象并抛出
然后程序员可以捕获到这个异常对象并进行处理;
如果没有捕获这个异常对象,那么这个异常将会导致程序终止
如何对待异常:
对于程序出现的异常一般有两种处理方式:
一遇到错误就终止程序的运行
另一种是要求程序猿在编写程序时就充分考虑各种可能会出现的错误和异常情况,尽力预防出现这些情况,实在无法避免的,要编写代码进行异常的检测、异常的处理,从而保证代码的健壮性
eg:
package com.ffyc.exception;
public class Demo7 {
public static void main(String[] args) {
try{
System.out.println(level((byte) 99));
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
try{
System.out.println(level((byte) 101));
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}finally {
System.out.println("crazy!!!");
}
System.out.println("aaaaaaaaaaa");
}/*
throws:用在方法声明时,表示此方法中有可能出现某种类型异常。此方法不处理异常,谁调用谁处理
throw:在方法体中使用,抛出一个具体的异常对象,该方法终止运行,在异常对象中的构造方法传入异常原因
*/
private static char level(byte score) throws Exception {
if (score<0||score>100){
throw new ScoreException("非法分数");
//当不满足某种条件时,程序中主动地抛出异常对象,终止此方法继续向下执行,通过异常构造方法传入异常原因
}
if (score>=90&&score<=100){
return 'A';
}else{
return 'B';
}
}
}
JAVA异常体系结构:
● Throwable
public String getMessage():获取发生异常的原因
Throwable分为两类:Error和Exception
分别对应着java.lang.Error和java.lang.Exception
Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等 严重情况。一般不编写针对性的代码进行处理。
例如:StackOverflowError(栈内存溢出)和OutOfMemoryError(堆内存 溢出,简称OOM)。
Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,需要使用针对 性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。
常见的异常:
Error:
栈溢出:StackOverflowError
堆溢出:OutOfMemoryError
Exception:
常见的六种异常,直接上代码
package com.ffyc.exception;
public class Demo1 {
public static void main(String[] args) {
/*异常指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致 JVM的非正常停止
异常:程序在运行过程中出现的不正常情况。
例如用户输入数据有问题,
*/
String s="zz";
System.out.println(s.charAt(3)); // 字符串索引异常
Object a=new Integer(456); //类型转换异常
String ss=(String) a;
int num=3; // 数组越界
int[] b=new int[1];
b[6]=0;
int d=0;
int sum=66;
//sum=sum/d; 算数异常,除数为0
Integer.parseInt("dnuaihud");
//NumberFormatException 数字格式化异常
//空指针异常:NullPointerException
}
}
异常处理:
java编程语言提供了异常处理机制进行处理错误
java处理异常是通过五个关键字:try catch finally throws throw 来进行的
基本语法:
try{
//可能存在异常的语句
}catch(捕获异常类型){
// 异常处理代码
}finally{
//一定会执行的代码
}
try:try中存放的是可能存在异常的代码,当try中语句发生异常时,该语句后面的代码不再执行,直接跳转到catch语句进行异常处理。所以不要随意将代码放到try语句块中
catch:捕获对应的异常,并对相应的异常进行处理,try代码块不存在问题时不会执行catch语句
catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数, 一个try后面可以写多个catch,分别捕获不同类型的异常,要从子类往父类 的顺序写,否则有编译错误
捕获异常的有关信息:
与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。
• getMessage() 获取异常信息,返回字符串
• printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的
位置。返回值void。
finally:无论try中是否存在异常语句,finally代码块一定会执行。且只能有一个finally语句
throws:在声明方法时使用throws抛出异常,不进行处理,而交由调用方法处理
任何方法都可以使用throws,包括抽象方法
调用使用throws声明的方法时,要么使用try--catch语句对异常进行处理,要么继续使用throws抛出异常
如果是运行期异常,则不会有提升,需要查看所调用的方法的代码结构
运行期异常和编译期异常:
编译期异常(checked异常、受检异常):在程序猿进行代码编写时就会出现的编译器提醒,可能不是异常(注意),而是编译器预防改处代码出现异常而做出的提醒,如果不进行处理,程序会报错,不会产生字节码文件
通常该异常不是程序猿的代码所引起的,例如:FileNotFoundException(文件找不到异常)
运行期异常(runtime异常、unchecked异常、非受检异常):在代码编译 阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何 提示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异 常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。
java.lang.RuntimeException类及它的子类都是运行时异常。
例如:
ArrayIndexOutOfBoundsException数组下标越界异常,
ClassCastException类型转换异常。
异常处理:
throw关键字使用于显示地抛出异常,用于方法体内部,抛出的是一个异常类地实例化对象
上代码:
package com.ffyc.exception;
public class Demo7 {
public static void main(String[] args) {
try{
System.out.println(level((byte) 99));
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
try{
System.out.println(level((byte) 101));
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}finally {
System.out.println("crazy!!!");
}
System.out.println("aaaaaaaaaaa");
}/*
throws:用在方法声明时,表示此方法中有可能出现某种类型异常。此方法不处理异常,谁调用谁处理
throw:在方法体中使用,抛出一个具体的异常对象,该方法终止运行,在异常对象中的构造方法传入异常原因
*/
private static char level(byte score) throws Exception {
if (score<0||score>100){
throw new ScoreException("非法分数");
//当不满足某种条件时,程序中主动地抛出异常对象,终止此方法继续向下执行,通过异常构造方法传入异常原因
}
if (score>=90&&score<=100){
return 'A';
}else{
return 'B';
}
}
}
自定义异常:
自定义异常就是自己定义一个异常类型,也就是API中标准异常类的直接或间接子类
自定义异常的作用:用于标记业务逻辑异常,避免与标准异常混淆
下面是我自己写的一个自定义异常类:
package com.ffyc.exception;
public class ScoreException extends Exception{
/*
自定义类:
根据自己的业务需求定义异常类型----自定义异常
分数自定义异常
分数不合法时抛出此类的对象
*/
public ScoreException(String message){
super(message);//默认调用父类(超类)构造方法
}
}
自定义异常类中往往不写其它方法,而是重载需要的构造方法
自定义异常类需要继承Exception。