JAVA 异常Exception讲解

[倾心笔记,请放下浮躁耐心理解]

一,java内置异常和核心方法Throwable;


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();//打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置


        }
    }
}

运行结果 

 可能大家不太理解,后续讲解会一一介绍,一阶段只是介绍使用方法而已。

二,Try Catch进行异常捕获

 

异常处理之捕获

 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()方法抛出了,
        //若没有对应的异常类进行捕获,则会默认打出异常堆栈
    }

注意;

若没有对应的异常类进行捕获,则会默认打出异常堆栈

三。java一场进阶之Finally讲解和多重捕获

多重捕获,二末尾已讲解

需要注意的是:代码中发生一场异常,则异常抛给第一个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为准

四,java异常处理之throws-throw关键字

代码出异常的处理方法

 

#这里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方法,叫做可查异常,要么你捕获,要么你抛出例子里面是捕获在本地自己解决,下面我来给大家继续抛出

 这里就是我们再次抛出

五,java进阶基础之自定义异常

下面的方法以后自定义都可以套用,大家有不理解的地方可能是一些基础没有掌握好,多搜索博客就行

注意。获取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;
    }
}

运行结果;

制作不易,记得三连!!!!!! 

 

  • 34
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以用一些例子来讲解一下Java异常处理。 Java 异常处理的主要目的是帮助我们在程序运行时避免出现错误的情况。在 Java 中,异常通常包括两种类型:checked exceptions 和 unchecked exceptions。 Checked exceptions 是指在编译时可以发现的异常。例如,在读取一个不存在的文件时,Java 会抛出一个叫做 FileNotFoundException 的 checked exception。在处理 checked exceptions 时,我们必须使用 try-catch 语句块来捕获和处理异常。 下面是一个示例代码: ```java try { File file = new File("someFile.txt"); FileReader fr = new FileReader(file); } catch (FileNotFoundException e) { System.out.println("File not found: " + e.getMessage()); } ``` 在这个示例代码中,我们尝试读取一个叫做 "someFile.txt" 的文件,但是如果该文件不存在,Java 就会抛出一个 FileNotFoundException 异常。在 try 语句块中,我们创建了一个 File 对象和一个 FileReader 对象,但是如果出现异常,就会跳转到 catch 语句块中进行处理。在 catch 语句块中,我们输出了一个错误信息,该信息包含了异常的详细信息。 Unchecked exceptions 是指在运行时才能发现的异常。例如,在尝试除以零时,Java 会抛出一个叫做 ArithmeticException 的 unchecked exception。 下面是一个示例代码: ```java int a = 10; int b = 0; try { int c = a/b; } catch (ArithmeticException e) { System.out.println("Cannot divide by zero: " + e.getMessage()); } ``` 在这个示例代码中,我们尝试将变量 a 除以变量 b,但是如果变量 b 的值为零,Java 就会抛出一个 ArithmeticException 异常。在 try 语句块中,我们进行了除法运算,但是如果出现异常,就会跳转到 catch 语句块中进行处理。在 catch 语句块中,我们输出了一个错误信息,该信息包含了异常的详细信息。 总而言之,Java 异常处理可以帮助我们在程序运行时避免出现错误的情况,并且可以通过 try-catch 语句块来捕获和处理异常。在编写 Java 代码时,我们应该注意处理可能出现的异常,以确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值