一.简介
1.异常解析
在程序执行的过程中发生了意外的情况,称为异常。
如:除数0,访问的下标不存在
一旦程序发生异常,将会终止程序,异常后面的代码就不执行了。
2.常见异常
ArithmeticException | 算术异常 | 除数为0 |
ClassCastException | 类型转换异常 | 类型强制转换时 |
NumberFormatException | 数字格式异常 | 转为数字 |
ParseException | 解析异常 | 日期格式 |
NullPointerException | 空指针异常 | 空对象调方法 |
java.lang.ArithmeticException 算数异常 除数为0
int a=3;
System.out.println(a/0);
java.lang.ArrayIndexOutOfBoundsException 数组越界异常
int[] b={1,2,3,4};
System.out.println(b[10]);
java.lang.NullPointerException空指针指向异常 对象为空 不能调用其方法
String c=null;
System.out.println(c.charAt(0));
java.lang.ClassCastException类型转化异常 强转时 {狗也是object类总不能转化成User类吧}
Object object = new Object();
String d=(String) object;
java.text.ParseException解析异常 日期格式
SimpleDateFormat sdf= new SimpleDateFormat("yyyy/MM/dd");
Date e = sdf.parse("2022-02-22");//字符串转化为date类型
System.out.println(e);
3.异常的分类
Throwable
Exception
检查异常
RuntimeExecption
Error
(1)Throwable 所有异常的父类
(2)Exception :异常 程序编辑过程中产生的异常,可以处理;
(a)检查异常:编译时提示需要处理的异常(直接抛出去,捕获异常)
(b)运行时异常(RunTimeException):运行时产生的异常,可以不去显示的处理 ,JVM在会处理 --- 就是把异常信息输出
(3)Error :错误,JVM和系统发生了错误,不能通过编码解决的,程序无法处理
4.产生
每一种异常在java中都对应一个java类来表示;
在程序发生异常时,会自动产生一个对应异常类对象,然后该异常对象交给jre,此过程就是抛出异常。
在jre接收到异常对象时,会寻找能处理异常的代码并不当前异常对象交个它处理,此过程为捕获异常。
Jre找不到处理的代码,程序终止。
5.处理异常
异常处理的方式:
(1)try.....catch 捕获
(2)throws 抛出异常
try{
//可能会有异常的代码
}catch(异常对象){
// 出现异常之后执行的代码
}finally{
//无论是否出现异常都执行
}
public static void main(String[] args) {
int[] a={1,2,3};
try {
System.out.println(a[10]);
/*System.out.println(a[0]);
return;finally依然执行
System.exit(0);终止当前运行的jvm finally不执行*/
System.out.println("找到错误就跳转到catch 不继续执行");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("捕获异常的代码"+e.getMessage());//打印异常信息
e.printStackTrace();//打印异常详细信息
}finally {
System.out.println("是否捕获到异常 都执行finally语句");
//关闭数据库代码 或 关闭相关资料
}
System.out.println("其他代码");
}
try:是必须的,catch和finally至少要跟一个
catch可以有多个,用来捕获不同类型的异常
public class throw_throws {
public static void main(String[] args){
//!throws 主方法中try
try {
test01();//不往主函数抛出方法
} catch (ParseException e) {
System.out.println("解决throws的"+e.getMessage());
}
//!!throw在函数内部手动抛出异常
test03(1, 0);
//自定义抛出类
try {
test04(300);
} catch (AgeException e) {
System.out.println("年龄超了");
e.printStackTrace();
}
}
//!通过throws关键词声明方法中存在异常
public static void test01() throws ParseException{
SimpleDateFormat day = new SimpleDateFormat("yyyy-mm-dd");
Date parse = day.parse("2022/01/22");
}
//!调用有异常的方法 可以继续抛
public static void test02() throws ParseException{
test01();
}
//!!通过throw在函数内部手动抛出异常
public static int test03(int a1,int a2){
if(a2==0){
throw new ArithmeticException("手动抛出异常啊啊啊啊啊啊啊除数不可以为0");
}
return a1/a2;
}
//自定义异常
public static void test04(int age) throws AgeException{
if(age>200){
throw new AgeException(age);
}
Scanner sc = new Scanner(System.in);
String s = sc.next();
if(age>200){
throw new AgeException(s);
}
}
}
//自定义年龄异常类 当前类属于异常的子类
class AgeException extends Exception{
public AgeException(int s){
System.out.println(s);
}
/*public AgeException(int s){
super(s);//调用父类方法进行输出
}*/
public AgeException(String s){
if(!s.matches("[0-9]")){//正则表达式 是否符合输入格式
System.out.println("非法字符");
}
}
}
throws:存在异常时,可以暂时不出来,由方法的调用者来处理。
(1)throws用来声明方法中会抛出的异常
(2)throw用来在方法中手动抛出异常
6.自定义异常
自定义异常类时,需要继承Exception类或是它的子类
一般继承Exception 和 RunTimeException
* 如果继承Exception ,则表示自定义的异常类为检查异常,必须处理(外抛/try...catch)
* 如果继承的RunTimeException,则为运行时异常,可以不处理
7.方法重写的异常问题
(1)父类的方法中不抛出异常,子类方法不能抛出异常
(2)父类的方法抛出异常,子类可以不抛
(3)重写的方法不能抛出比父类异常范围更大的异常
class A {
public void show() throws ArithmeticException{
System.out.println("show()");
}
}
class B extends A{
@Override
public void show() {
super.show();
}
}
这是一边看视频一边学习的笔记-借用了部分老师的笔记内容-如有侵权,通知删除!
新手小白学习之路~~~