栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaSE中的异常

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaSE中的异常

5.异常 5.1异常的概念

在Java语言中,将程序执行中发生的不正常情况称为“异常”

异常可以分为2类一类是虚拟机无法解决的问题,代码无法处理的异常,叫Error,

还有一类是可以通过代码处理的异常,比如空指针,数组越界等。

public class test1 {
    public static void main(String[] args) {
     int c=10/0;
        System.out.println(c);
    }
}

这就是一个异常,下面会提升,ArithmeticException意思是算术异常,大家都知道除数是不能为0的,by zero at one test.main意思是异常在那个方法里,java:5表示在第几行代码.

5.2异常的体系

可处理的异常可以分为编译期异常(Checked Exception)和运行期异常(RuntimeException).

编译期异常有I/O异常和SQL异常等,在出现异常后,系统会强制提示你去处理这个异常。

运行期异常数学异常,空指针异常,数组下标越界等,只有在运行程序时才会报错.

下面这幅图可以描述异常的体系

5.3异常处理

异常处理通常有5个关键字,try,catch,finally,throws,throw。其中前三个通常可以配合使用。

try:检测不安全的代码块(发现异常),ry块中任何一条语句发生了异常,下面的代码将不会被执行,程序将
跳转到异常处理代码块中,即catch块。因此,不要随意将不相关的代码放到try块中,因为随时可能会中断执行。

catch:把抓到的类型匹配的异常捕获,保证程序能继续运行下去catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数,一个try后面可以写多个catch,分别捕获不同类型的异常,要从子类往父类的顺序写,否则有编译错误.

捕获异常后可以用一下方法去处理异常:

getMessage() 获取异常信息,返回字符串,通常是写提示信息
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

(2)try catch finally 有一些组合,

try catch finally 有一些组合,

try{}catch{}组合

 try{
         int a=10/0;//try中的代码块用来写可能出现异常的代码
         int b=20;//当上面的代码出现异常之后,便不会执行下面的代码直接跳到catch里去
         System.out.println(b);
     }catch(Exception e)
     {
         e.printStackTrace();//当try中出现了异常之后,catch会捕获这个异常,然后处理异常
     }

try{}catch{}finally{}组合

try{
         int a=10/0;//try中的代码块用来写可能出现异常的代码
         int b=20;//当上面的代码出现异常之后,便不会执行下面的代码直接跳到catch里去
         System.out.println(b);
     }catch(Exception e)
     {
         e.printStackTrace();//当try中出现了异常之后,catch会捕获这个异常,然后处理异常
     }
     finally{
         System.out.println("我出现算术异常了");
     }
    }
 java.lang.ArithmeticException: / by zero
	at lianxi.bc.main(bc.java:6)
我出现算术异常了  

finally中的代码是必须要执行的.它可以提示一下用户发生了什么事情。

try{} catch{}中还可以嵌套try catch,try 还可以有多个catch,try{}catch{}catch{

还有try{} finally{}。

try catch 嵌套 try catch

try{
         int a=10,b=0;
         int c;
         try{c=a/b;}
         catch (Exception e){
             System.out.println("除数不为0");
         }
     }catch(ArithmeticException e)
     {
         System.out.println("出现算术异常");
     }
运行结果只有:除数不为0
出现catch运行之后程序将不再执行后面的东西.

try 有多个catch

 try{
         int a=10/0;//try中的代码块用来写可能出现异常的代码
          int arr={1,2,3};
           arr[4]=10;
     }catch(ArithmeticException e)
     {
         System.out.println("出现算术异常");
     }catch(NullpointerException){
         System.out.println("出现空指针异常");  
     }catch(Exception e) {
         System.out.println("出现异常");
     }
     finally{
         System.out.println("我出现算术异常了");
     }
出现算术异常
出现空指针异常
我出现算术异常了

在这种情况下,ArithmeticException是Exception的子类,他应该写到Exception之前不然程序会报错的,就是当有多个异常时,父类类型应放在子类类型下面。

当异常中含有return 时,finally 就不是最后一个执行的了

public class test1 {
    public int test(){
       try{ int a=10/0;
        return a;
    }catch(Exception e){
           System.out.println("异常");
           return 1;
    }finally {
           System.out.println("finally");
       }
       }
    public static void main(String[] args) {
        test1 a=new test1();
        System.out.println(a.test());
    }
}
异常
finally
1

在这个代码中,try出现了异常,然后catch捕获输出异常,然后执行finally代码,输出finally,最后返回一个值,因为try后代码不执行了所以会return catch里面的值,输出1.

(3).throw关键字,throw关键字是用来声明异常的,但是他不处理异常,谁调用这个方法,谁去处理这个异常。

 public static void main(String[] args) {

        try {
            abcd.test1();//(4)调用test(1)方法,没人调用他了他只能处理异常了,所以try catch处理
        } catch (UnsupportedEncodingException e) {
            System.out.println("sb");
        }
    }
    public  static  void test1() throws UnsupportedEncodingException {
        abcd.test2();//(3)调用test(2)方法,他也没处理异常
    }
    public static void test2() throws UnsupportedEncodingException,NullPointerException {//(2)throws 声明异常,
        String s="abc";
        s.getBytes("utf-811");//(1)产生异常
        System.out.println(s);
    }

上面的(1)(2)(3)(4)顺序能说明问题.

(4)throw关键字,抛出一个异常,他也可以自己处理异常,也可以向上抛出.在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。

public static void main(String[] args) throws b {
        try{
            System.out.println(d.sanjiao(1,2,3));
        }catch (b e){
            e.printStackTrace();
        }
    }
    public static String sanjiao(int a, int b, int c) throws b {
        if(a>0&b>0&c>0){
            if((a+b)>c&&(a+c)>b&&(b+c)>a){
                System.out.println("可以三角形");
            }
            throw new two.b("两边之和不大于第三边");//在这个方法中,当不可以为三角形时,就别互相异常了,用throw抛出一个异常两边这和不大于第三边
        }
        throw new two.b("边不大于0");//当他输入的三角形边为负数时,也不可以所以抛出异常
    }

(5)throws和throw的区别

throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try catch捕获异常,要么使用throws声明异常
throws用于方法声明处,用来声明该方法可能发生的异常类型,可以是多个异常类型,用来强制调用该方法时处理这些异常
抽象方法也可以使用throws.

5.4自定义异常

自定义异常的作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆

自定义异常类中往往不写其他方法,只重载需要使用的构造方法 继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或throws抛出

public class b extends Exception {//继承Exception
public b (String msg){//重载构造方法
    super(msg);
                     }
}
 public static void main(String[] args)  {
        try {//(3)调用方法,处理异常
            c.train(105);
        } catch (two.b b) {
            b.printStackTrace();
        }
    }
    public  static void train(int score) throws b {//(2)throws声明
        if(score>100||score<0){
            throw new b("输入错误");//(1)throw抛出
        }
        if(score>90){
            System.out.println("A");
        }else{
            System.out.println("B");
        }
    }
two.b: 输入错误
	at two.c.train(c.java:17)
	at two.c.main(c.java:9)
这就算一个自定义异常被调用了.
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644286.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号