目录
五:异常处理机制
1.异常概述
什么是异常:程序执行报错或者是出现了不正常的现象
-
编译错误:没有遵循Java语法规则
-
逻辑错误:程序结果不是我们所期待的结果
-
运行时错误(重点):运行时候抛出,有可能抛出,需要提前解决的
2.异常处理
常见异常
-
java.long.ArrayIndexOutOfBoundsException---------数组索引越界异常(下标索引越界:复数或者太大)
-
java.long.NullPointerException---------空指针异常(只创建引用;未new出实例)
-
java.long.NumberFormatException---------类型转换异常
-
java.long.StackOverflowError---------栈溢出错误
-
java.long.OutOfMemoryError---------内存溢出错误
-
java.long.UnknownError---------未知错误
如何查找异常位置
-
抛出异常时会有线程名称:类的完整名字加上线程名字
-
还有报错的类型,java.lang.ArrayIndexOutOfBoundsException:数组索引越界
-
还有报错的行数:15行
-
补充:如果程序在某一行发生了异常;那么程序会在这一行中断;后面的代码不会继续执行
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at Test08.main(Test08.java:4)
try,catch,finally用法
-
因为某一行代码抛出异常后,会中断jvm,程序便不会继续执行,那么如何解决呢?
-
第一种方式:使用try,catch解决
try{ //从try里面开始执行 //可能发生异常的代码块 //如果发生异常会自动生成一个异常对象,该异常对象会被提交给java运行时系统 //然后去catch里面匹配,如果成果就可以继续向下执行,执行catch里面的代码块 //如果匹配不成功,jvm还是会中断,同时报错 }catch(ArrayIndexOutOfBoundsException e){ //从上而下匹配,因此最好是,范围从小到大依次捕获 System.out.println("数组下标越界啦!"); e.printStackTrace(); //该方法可以输出具体的异常信息 }catch(Exception e){ //如果e捕捉到了,就执行本代码块中的代码 }finally{ //无论是否报错,都运行这里面的代码 }
-
顺序异常,catch捕获异常一定要范围从小到大(最后在写Exception e)
异常类介绍
-
Throwable是超类,所有异常都会间接的继承该类
try{ //可能发生异常的代码块 }catch(Exception e){ System.out.println("您的程序执行报错啦!"); }
-
Error类(错误)与Exception类(异常)继承与Throwable类
-
类之间的继承关系可以使用,Ctrl+Ait+u(idea)生成类图
-
异常类继承了Throwable类,含有Throwable类中的方法和属性
Throwable类介绍
-
getMessage方法:返回异常信息内容,该方法为String类型
-
printStackTrace方法:输出异常信息,该方法为void类型
-
Throwable方法概览
编译时异常与运行时异常的区别
-
编译时异常:.java文件源代码编译成 .class文件(在编译时发生异常,无法编译为.class文件)
-
编译时异常idea(编译软件)会用红色感叹号表示
-
编译时异常强制性要求try,catch去捕获一下异常
-
运行时异常:.java文件源代码已经编译成 .class文件,java程序在运行时有可能会发生的异常
-
运行时异常不需要强制性要求try,catch捕获异常
如何区分编译时异常与运行时异常
-
RuntimeException类下的所有子类都为运行时异常
-
如果异常没有继承到RuntimeException类就是编译时异常
异常处理之throws
-
throws为抛出异常的意思
-
当thorws异常加在某方法上时,若调用该方法,那么该方法的调用者必须try/catch或者throws抛出
-
意思就是如果有异常,如果不捕获,就必须抛出(往上抛出)
-
最后会抛到main(String[] args)方法
-
如果再抛出,那么就是jvm(java虚拟机)处理该异常了
-
说的简单一点就是:如果方法加上了throw + 编译时异常;并且如果谁调用了该方法,那么就必须处理该异常或者继续向上抛出
自定义异常
public class Main{
public static void mian(String[] args) throws LoginException{
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的用户名和密码!");
String userName = scanner.next();
String pwd = scanner.next();
login(userName,pwd);
}
public static void login throws LoginException(String userName, String pwd){
if(("mayikt".equals(userName)&&"123456".equals(pwd))){
//如果用户输入的用户名或者密码不正确,就抛出该异常
throw new LoginException("用户输入的名称或者密码不正确!");
}
}
}
class LoginException extends Exception{
public LoginException(String message){
super(message);
}
}