异常类有两个直接子类:Exception类 Error类
Exception类时所有异常类的父类
java虚拟机无法解决的严重问题
error发生在jvm中 比如栈满StackOverflowError
Exception 异常
运行时异常 直接或者间接继承RuntimeException
在编译期不强制要求处理
编译时异常
直接或间接继承Exception与RuntimeException没有关系
在编译期间强制要求处理,否则不能编译.
异常提示 ArrayIndexOutOfBoundsException
int [] a=new int[5];
a[5]=10;
异常提示 NullPointerException
String a=null;
System.out.println(a.length());
异常提示 ClassCastException
Object a ="abc";
Integer b=(Integer)a;
异常提示 NumberFormatException
new Integer("abc");
异常提示 ArithmeticException
int a=19;
int b=0;
System.out.println(a/b)
java异常处理是通过5个关键字来实现的:try catch finally throw throws
try{
可能会出现的异常的代码
任何语句发生异常,下面的代码不会被执行,程序将跳转到异常处理代码块中
}catch(异常类型 ){
处理异常的代码
getMessage()获取异常信息,返回字符串
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。
}finally{
无论是否出现异常,finally块的代码都会执行
}
try+finally 语句块 没有处理 如果有异常 代码执行到finally就会终止
在catch语句中异常大的放在下面
package com.lsy.javaException.day2;
public class Demo1 {
public static void main(String[] args) {
int []a = new int[3];
try{
a[3]=10;
System.out.println(a[3]);
} catch(Exception e){
e.printStackTrace();//打印信息到控制端
System.out.println("数组越界");
}
}
}
try+catch+finally 执行顺序 (无return)1.try 2.catch 3.finally
有return情况下 先执行finally
package com.lsy.javaException.day2;
public class Demo2_3 {
public int test(int a,int b){
/* int c; 这里对c没有赋值
try{
c=a/b;这里进行对c的初始化
}catch (Exception e){
System.out.println();
}finally {
}
return c; 这里报错的原因是c的初始化在try中,如果出现异常对c不进行赋值*/
/*
当try和catch中有return时 程序先执行finally
*/
try{
return a/b;
}catch (Exception e){
return -1;
}finally {
System.out.println("aaaaaaaa");
}
}
public static void main(String[] args) {
Demo2_3 a = new Demo2_3();
System.out.println(a.test(10,0));
}
}
throws是声明方法可能要抛出的各种异常 表示此方法不处理异常,而交给方法调用处进行处理
任何方法都可以使用throws关键字声明异常类型,包括抽象方法
子类重写父类的方法,子类方法不能声明比父类类型更大的异常(针对编译器异常)
使用throws的方法,调用时必须处理声明的异常,要么使用try-catch要么继续抛出
throw关键字用于方法体中,用来抛出的是一个异常对象
在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
throw new 异常类构造方法
package com.lsy.javaException.day2;
public class Demo6_1 {
public String ScoreCheck(int score) throws Exception{
if(score<0||score>100){
throw new Exception("成绩不合法");
}
if(score>90){
return "优秀";
}
else {
return "不优秀";
}
}
public static void main(String[] args) {
Demo6_1 demo6_1 = new Demo6_1();
try{
demo6_1.ScoreCheck(101);
}catch (Exception x){
x.printStackTrace();
}
}
}
自定义异常时自己定义的异常类,就是api中的标准异常类的直接或间接的子类
作用:用自定义异常标记业务逻辑的异常
基本语法
public class 异常类名 extends Exception/RuntimeException{
public 异常类名(String message){
super(message)
}
}
package com.lsy.javaException.day2;
public class scorecheckException extends Exception {
/*
根据需要,自定义异常
*/
public scorecheckException(String message){
super(message);
}
}
package com.lsy.javaException.day2;
/*
自定义异常
*/
public class Demo6_2 {
public String ScoreCheck(int score) throws scorecheckException{
if(score<0||score>100){
throw new scorecheckException("成绩不合法");
}
if(score>90){
return "优秀";
}
else {
return "不优秀";
}
}
public static void main(String[] args) {
Demo6_2 demo6_1 = new Demo6_2();
try{
demo6_1.ScoreCheck(101);
}catch (scorecheckException x){
x.printStackTrace();
}
}
}