目录
2.自己处理(捕获异常)--程序员自己处理---------不让程序停止运行
异常:异常就是代表程序出现的问题
Error:系统级别错误
Exception:异常,代表程序可能出现的问题
RuntimeException及其子类:编译阶段不会出现异常提醒,运行时出现的异常(如数组索引越界异常)
编译时异常:编译阶段就会出现异常提醒的(如日期解析异常)
异常的作用:查询bug的关键参考信息
作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常的处理方式:
1.JVM默认的处理方式
把异常的名称,异常原因及异常出现的位置等信息输出在控制台(红色字体)
程序停止运行,下面的代码不会再执行
2.自己处理(捕获异常)--程序员自己处理---------不让程序停止运行
try{
可能出现异常的代码;
} catch(异常类名 变量名){
异常的处理代码;
}
目的:当代码出现异常时,可以让程序继续往下执行
注意:
(1).若try中出现了多个问题,需要书写多个catch与之对应,不然只会执行被捕获的catch
例如:
try{
}catch(){
}catch(){
}catch(){
}
(2)如果try中遇到的问题没有被捕获,相当于try...catch的代码白写了,最终还是会交给虚拟机进行处理
(3)如果try中遇到了问题,那么下面的代码就不会执行了,会直接调转到catch当中执行解决方法代码如果没有与之对应的代码,还是会交给虚拟机处理
(4)如果try中没有遇到问题,会把try中所有的代码执行一遍,不会执行catch中的代码
Throwable的成员方法:
细节:仅仅是打印异常信息,不会停止程序运行
(1) publci String getMessage() 返回此throwable的详细消息字符串
(2) public String toString() 返回此可抛出的简短描述
(3) public void printStackTrace() 把异常的错误信息输出在控制台---- 底层是用 System.err.println()进行输出以红色字体打印
3.抛出异常(交给调用者处理)-----告诉调用者出错了
(1)throws 写在方法定义处,表示声明一个异常,告诉调用者使用本方法可能会有哪些异常-----编译时异常必须要写,运行时异常可以不写
public void 方法()throws 异常类名1,异常类名2.……{
.......
}
(2)throw 写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的代码不再执行了
public void 方法()[
throw new NullPointerException(); //结束
//下面的代码不会执行
}
(4).自定义异常:
1.定义异常类
2.写继承关系
3.空参构造
4.带参构造
意义:就是为了让控制台的报错信息更加的见名知意
定义:
public class NameFormatException extends RuntimeException{}
public class NameFormatException extends Exception{}
//NameFormat:当前异常的名字(姓名格式错误)
//Exception:表示当前类是一个异常类
//运行时异常:继承RuntimeException类 ----核心:表示由于参数错误而导致的问题
//编译时异常:继承Exception类 ------核心:提醒程序员检查本地信息
public class NameFormatException extends RuntimeException{ //自定义异常类
/*
* 姓名格式错误是后期程序运行时用户输入参数错误导致的,属于运行异常 所以继承RuntimeException类
* */
//构造方法
public NameFormatException() {
}
public NameFormatException(String message) {
super(message);
}
}
try...catch升级版
try{
可能出异常的代码
}catch(){
异常代码的解决方案代码
}finally{
上述代码执行完毕后此处代码不管如何都一定会被执行,除非虚拟机停止
}
接口AutoCloseable 特定情况下可以自动释放资源
JDK7方案:
try(创建流对象1;创建流对象2){
可能出现异常的代码
}catch(异常类名 变量名){
处理代码
}
资源用完最终自动释放
JDK9方案:
创建流对象1;
创建流对象2;
try(流1;流2){
可能出现异常的代码
}catch(异常类名 变量名){
处理代码
}
资源用完最终自动释放
//throw new RuntimeException(); //返回异常信息打印在控制台
//System.out.println(2/0); //算数异常 0不能做被除数
int[] arr = {1,2,3,4,5};
//自己处理----捕获异常
try {
System.out.println(arr[10]);
/*
* 此处出现了异常,程序就会在这里创建一个ArrayIndexOutOfBoundsException对象
* new ArrayIndexOutOfBoundsException();
* 拿着这个对象到catch的小括号里对比,看括号中的变量是否可以接受这个对象
* 如果能被接收,就表示该异常被捕获(抓住) 执行catch里面对应的代码
* 当catch里面的代码执行完毕,继续执行try...catch体系下面的其他代码
* */
} catch(ArrayIndexOutOfBoundsException e) { //ArrayIndexOutOfBoundsException 数组索引越界异常
System.out.println("索引越界了");
String message = e.getMessage(); // 返回此throwable的详细消息字符串
String tostring = e.toString();//返回此可抛出的简短描述
System.out.println("打印异常消息字符串"+message); //打印异常消息字符串
System.out.println("打印可抛出的简短描述"+message); //打印可抛出的简短描述
e.printStackTrace();//异常的错误信息输出在控制台
}
System.out.println("测试");
//控制台红色字体打印err 错误的输出语句,用来打印错误信息
System.out.println("123");
System.err.println("1234567");
System.out.println("------------抛出异常测试----------");
int[] arr1 = null;
int max=0;
try {
max = getMax(arr1);
}catch(NullPointerException e){
System.out.println("空指针异常");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("数组索引越界异常");
}
System.out.println(max);
public class GirlFriend {
private String name;
private int age;
//构造
public GirlFriend() {
}
public GirlFriend(String name,int age) {
this.name = name;
this.age = age;
}
//set && get
public void setName(String name) throws RuntimeException{ //运行时异常的 throws RuntimeException在方法定义时可写可省略 //编译时异常必须写 throws ERxception
if(name.length() <3|| name.length() > 10) {
//throw new RuntimeException(); //自定义异常之后就可以抛出自己定义的错误了,不用在抛出系统定义的
throw new NameFormatException(name+"格式有误,标准长度为3-10"); //自定义名字格式错误异常
}
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) throws RuntimeException{
if(age < 18 || age > 40) {
//throw new RuntimeException();
throw new AgeOutOfBoundsException(age+"超出范围,标准范围为18-40"); //自定义年龄格式错误异常
}
this.age = age;
}
public int getAge() {
return age;
}
}