Java中的异常

一、异常概述

什么是异常:
    程序运行中出现的不正常情况
    如:数组越界  int[] a=new int[5];
                b=a[5];//访问时数组越界
    程序运行过程中由于用户输入的格式有问题、读取文件文件被删除了、网络传输过程中断
    网了等就会导致程序出现不正常情况-->异常

需要注意的是,语法错误并非异常

java中的默认异常处理机制:
    当程序出现异常后,会将异常的信息包装在一个对应的对象中,并抛出此对象并终止程序运行
    控制台报错时,结构是 在某某线程中,异常的类型,异常的原因,异常的位置
    如:Exception in thread "main" //主线程
       java.lang.ArrayIndexOutOfBoundsException: 5//类型是数组越界,原因是索引值5
       at com.wbc.Exception.异常概述与常用异常.ExceptionDemo.main(Demo1.java:9)
       //程序运行的位置
异常的处理:
    1、遇到异常就终止程序运行
    2、编写代码时就充分考虑可能出现的情况。实在无法避免的要编写代码进行处理

二、常见的异常

//ArrayIndexOutOfBoundsException数组越界
int[] a =new int[5];
/*for(int i =0;i<=5;i++){
    a[i]=i;
}

//java.lang.StringIndexOutOfBoundsException字符串越界
String s ="abcd";
s.charAt(4);

//java.lang.ArithmeticException算数异常
/*int x=10;
int y=0;
int z=x/y;*/

//java.lang.NullPointerException空指针
/*String s=null;
s.length();*/


//java.lang.ClassCastException类型转换异常
/*Object s ="abcd";
Integer ac =(Integer)s;*/

//java.lang.NumberFormatException数字格式化异常
/*int ab = Integer.parseInt("abc0");
System.out.println(a);*/

三、异常的体系结构

异常的体系结构
    Java.lang.Throwable 异常体系的根父类
    内韩两个常用方法:
        public void printStacktrace();打印栈中的异常信息
        public String getMessage();获取异常的信息

    Throwable的两个子类
        Error:错误
               java虚拟机无法解决的严重问题,如:jvm系统内部错误,资源耗尽、内存不够用等
               是系统姓错误,java程序无法解决
        Exception:异常(这是本章要学习的)
               是出现的一般性问题,可以使用java中的异常处理机制进行处理的
                    运行时:ArithmeticException、NullPointerException...
                    非运行时:
        广义异常:所有的报错都可以称为异常
        狭义异常:Exception

四、异常的处理

异常处理
    java中提供一套异常处理机制没在程序发生异常时,可以执行预先设定好的处理程序,执行完成
    后,程序会停止,可以继续向后执行
    在写代码时,就要根据不同的情况设定好处理程序,
    运行程序:
    程序执行时,出现问题,执行异常处理程序
             没有出现问题,则不需要进行异常处理程序

    关键字:
        try{
            执行可以产生异常的代码
        }

        catch(){
            处理方式
        }

        finally{
            必须要执行的代码
        }

        thorw:用于手动抛出异常,一般写在方法体之内,当满足或不满足某种情况需要抛出时使用
        throws:抛出异常,一般写在方法声明中,当运用此方法时可获得其提示的异常类型,方便处理
相关示例
        1)try-catch-finally
package com.wbc.Exception.异常处理.catch_finally;

public class Demo2 {
    public static void main(String[] args) {
        try {

            String s =null;
            s.length();

            int a = 10;
            int b = 0;
            int c = a / b;


        }
        catch (ArithmeticException a){
            a.printStackTrace();
            System.out.println("除数不能为0");
        }
        catch (NullPointerException n){
            //try中的代码一旦出现异常,后面的代码就不会执行了转而执行对应的catch
            n.printStackTrace();
            System.out.println("对象为空指针");

        }
        catch (Exception e){//写Exception是在怕分辨不出哪里异常,但zx需要写到最底下
            System.out.println("程序异常"+e.getMessage());
        }
        finally {
            //必须要执行的代码
            //例如IO里的close
        }
        System.out.println("over");
    }
}
2)throws
package com.wbc.Exception.异常处理.throws_throw;

import java.io.UnsupportedEncodingException;

public class demo4 {
    public static void main(String[] args) {

        //不强制处理是因为这是个运行时异常,在运行时才可能会异常抛出
        //在编译期间不会强制处理,在写代码时需要注意
        chu(1,0);


        //这是个编译器异常,在编译的时候就会异常抛出
        //处理方法有两种 1、try_catch  2、throws 一般到顶层就不能再throws了
        try {
            test();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    /*
    在方法声明的地方,通过throws关键字,声明此方法可能会出现异常
    使用throws抛出异常表示此方法不处理异常,交给调用这个方法的地方进行处理
    一般在底层的方法中都不进行处理
     */
    public static int chu(int a,int b)throws ArithmeticException{
        int c =a/b;
        return c;
    }

    public static void test() throws UnsupportedEncodingException {
        "abc".getBytes("utf-8");
    }
}
3)throw
//异常
package com.wbc.Exception.homework.triangle;

public class FormTriangleException extends Exception{
    public FormTriangleException() {
    }

    public FormTriangleException(String message) {
        super(message);
    }
}
//测试
package com.wbc.Exception.homework.triangle;

import java.util.Scanner;

public class triangle {
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);
        int a =scanner.nextInt();
        int b =scanner.nextInt();
        int c =scanner.nextInt();
        try {
            checkTriangle(a,b,c);
        } catch (FormTriangleException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
    public static void checkTriangle(int a,int b,int c)throws FormTriangleException{
        if(a+b<=c||a+c<=b||b+c<=a){
            throw new FormTriangleException("不能构成一个三角形!");
        }

    }
}
4)自定义异常
    java API中定义的时标准异常类,都是与语法相关的,如索引越界、空指针等 在编写程序时,有可能在满足某种业务需求时,想要以抛出异常的方式进行处理 就需要自定义一个与业务相关的异常类来表示(如同分数不合法--ScoreException)
package com.wbc.Exception.异常处理.自定义异常;

public class ScoreException extends Exception{

    public ScoreException() {
    }

    public ScoreException(String message) {
        super(message);//调用父类的方法
    }
}
package com.wbc.Exception.异常处理.自定义异常;

public class Score {
    public static void main(String[] args) {
        int score =110;
        try {
            checkScore(score);
        } catch (ScoreException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
    public static char checkScore(int score) throws ScoreException {
        if(score<0||score>100){
            //一般在方法体内
            // 当满足或不满足某种条件时,主动抛出一个异常对象,程序不可继续执行
            throw new ScoreException("分数非法");
        }
        else if(score<60){
            return 'D';
        }
        else if(score>=60&&score<75){
            return 'C';
        }
        else if(score>=75&&score<85){
            return 'B';
        }
        else
            return 'A';
    }
}

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京最后的深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值