Throwable是一个异常的顶级类,他下分为Error可简单理解为高铁运行中脱轨,人为无法干预,常见的如代码超出内存,人为不可控。所以我们把精力集中于Exception即可。
IOException是代码运行前系统可帮你检查出来,RuntimeException是运行时候的异常,比如数组越界,运行前是找不到的,接下来会详细介绍这两种Exception.
首先,大家需要知道是每个异常是在java中有对应的类的,他们都继承Throwable,我们可以在IDEA中双击Shift,查找对应的类,来理解错误,或者在百度搜索,慢慢的掌握每一个。
现在我们来实践一下Throwable方法,里面用到了try{}catch(Exception){}补获方法,大家先接触一下
package chapter7_2;
public class Exception {
public static void main(String [] args){
try{
int result = 25/0;//除数不能为0
System.out.println(result);
}catch(java.lang.Exception e){
String mgs =e.getMessage();//得到异常的详细信息
System.out.println(mgs);
System.out.println("==============================================");
StackTraceElement [] arr=e.getStackTrace();//堆栈层次的数组
System.out.println(arr);
System.out.println("===============================");
e.printStackTrace();//打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置
}
}
}
运行结果
异常处理之捕获
finally在后续课程讲解,第二节首先教大家使用Try Catch捕获(Exception是顶级类,可以细分)
case里面的类要选则java.long包的下的Exception.
代码演示
package chapter7_3;
public class Exception2Test {
public static void main(String[] args) {
try {
//try 如过没有错误,就不读取catch,若出错,则执行
int result = 25 / 0;//除数不能为0
System.out.println("正常执行");
System.out.println(result);
}catch (Exception e){
System.out.println("进入exception begin");
e.printStackTrace();
System.out.println("进入exception end");
}
}
}
运行结果
这里告诉你by 0 即错误原因,还有对应的位置类
such2
代码
package chapter7_3;
public class Student {
private int age;
private String name;
public void setAge(int age){
if(age<0){
throw new IllegalArgumentException("参数异常");//后续会学。这程序员设计是一个抛出异常。。。。。。。这句代码就是抛一个对象出去对象 new Illegal...(“参数异常”)
}
this.age=age;
}
public int getAge(){
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
=================================================================
package chapter7_3;
public class Exception2Test {
public static void main(String[] args) {
// try {
// //try 如过没有错误,就不读取catch,若出错,则执行
// int result = 25 / 0;//除数不能为0
// System.out.println("正常执行");
// System.out.println(result);
// }catch (Exception e){
// System.out.println("进入exception begin");
// e.printStackTrace();
// System.out.println("进入exception end");
//
// }
test();
}
public static void test(){
Student student = new Student();
student.setAge(-1);
}
}
结果; 这里会抛出错误,但是,如果你已经知道了此错误会出现,这里就用到了我们的try catch捕获,话不多说,代码见//下面代码只展示try catch方法 即上面的代码的test()方法
public static void test(){
try{
Student student = new Student();
student.setAge(-1);
}catch(Exception e){
System.out.println("出异常了");
}
}
结果如你所愿
现在我们来讲多个异常块,可以理解为Exception下面细分的子类,话不多说,上代码、(和上面一样,这里我只对test()方法进行修改),上代码!
public static void test(){
try{
Student student = new Student();
student.setAge(-1);
}catch(NullPointerException e){
System.out.println("出异常了 NullPointerException");
}catch(IllegalArgumentException){
System.out.println("出异常了 IllegalArgumentException");
}//这里会执行Illegal,因为在Student中已经用throw()方法抛出了,
//若没有对应的异常类进行捕获,则会默认打出异常堆栈
}
注意;
若没有对应的异常类进行捕获,则会默认打出异常堆栈
多重捕获,二末尾已讲解
需要注意的是:代码中发生一场异常,则异常抛给第一个catch块,如果不匹配则继续网下一个catch进行传递
Finally讲解
代码演示
package chapter7_4;
public class TestException3 {
public static void main(String[] args) {
int result = divide(25,5);
System.out.println("最终的结果="+result);
}
public static int divide(int num1, int num2) {
try {
int result = num1 / num2;
return result;
} catch (Exception e) {
System.out.println("出异常");
} finally {
System.out.println("finally 执行了");
}
return -1;
}
}
我们看,这里num2不为0 ,且catch没有运行,但是finally运行了,而且在return result之前!
这里我们能很好的理解finally语句的使用方法
******************面试题*********************
public class TestException3 {
public static void main(String[] args) {
int result = divide(25,5);
System.out.println("最终的结果="+result);
}
public static int divide(int num1, int num2) {
try {
int result = num1 / num2;
return result;
} catch (Exception e) {
System.out.println("出异常");
} finally {
System.out.println("finally 执行了");
return -2;
}
//return -1;
}
}
结果
这里的话,当try catch finally的 话 ,以finally为主
#返回结果以finally为准
代码出异常的处理方法
#这里throws在方法右面 而throw以一个对象的身份在方法里面
#核心 -----往外抛
可能文字无法让大家理解,话不多说,上代码!(下面的代码我来交你怎么抛哈哈哈,这其实跟套娃和甩锅差不多)
package chapter7_5;
public class TestException5 {
public static void main(String [] args){
try{
int result = divide(35,0);//需要说明的是,在方法体中加上throws的话,就是一个可查异常,就是系统强迫你用try来 解决,不然会报错
System.out.print("result="+result);
}catch(Exception e){
System.out.print("main异常");
}
}
public static int divide(int num1,int num2)throws Exception{//这里的throws Exception可以理解为一个抛出的借口
try{
int result = num1/num2;
return result;
}catch(Exception e){
System.out.println("出异常了");
throw new Exception("参数异常");//生成对象调用上面的借口,注意调用这个方法还是错的,需要继续抛
}//
//如果这里不用throws的话就需要在这里加return -1;就是直接出来异常。;若想不报错,就是用throws跑出去
//就相当于给外面说一声异常了,所以我不返回值了,正常的return -1;就会报错。因为你已经说错了,就不会按照既定的返回值
}
}//运行的顺序为 先在方法体里面异常,被里面的try catch捕获,然后new Exception抛出到主函数的try再次被捕获
还可以继续抛出,下面体现了对异常的处理的两个原则,
在本地处理 或者 抛出
这是报错的,因为有异常,且这里与0 无关,因为在方法体右面用了throws方法,叫做可查异常,要么你捕获,要么你抛出例子里面是捕获在本地自己解决,下面我来给大家继续抛出
这里就是我们再次抛出
下面的方法以后自定义都可以套用,大家有不理解的地方可能是一些基础没有掌握好,多搜索博客就行
注意。获取Exception类,Ctrl+左键
话不多说,上代码,
package chapter7_6;
public class CustomExceptionTest {
public static void main(String [] args) {
try {
test();
}catch(UserNotEnoughException e){//()里面的相当于创建了XXXException的对象,查看代码,结合构造函数,这里相当于完成了set的调用
int code=e.getCode();//所以这里直接get就可以
String mgs=e.getMgs();
System.out.println("code="+code+"mgs"+mgs);
}
}
public static void test()throws UserNotEnoughException{
throw new UserNotEnoughException(-1,"人员不够");//建造一个Excepton为了验证刚刚的自定义Exceptionfang方法
}
}
==================================================================
package chapter7_6;
public class UserNotEnoughException extends Exception {
//可以直接定义自己的属性,也可重写构造器中 的方法
private int code;
private String mgs;
public UserNotEnoughException(){
super();//不理解super()和构造方法 看博文即可
}
public UserNotEnoughException(int code,String mgs){
super(mgs);
this.code=code;
this.mgs=mgs;
}
public void setCode(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public void setMgs(String mgs) {
this.mgs = mgs;
}
public String getMgs() {
return mgs;
}
}
运行结果;