Java 异常

文章详细介绍了Java中的异常概念,包括异常的分类(Error和Exception,运行期异常和编译期异常),异常处理机制(try-catch-finally结构,以及throw和throws的使用),并通过示例代码展示了如何捕获和处理不同类型的异常。
摘要由CSDN通过智能技术生成

Java 异常概念

异常:不正常情况

广义上的异常:程序运行时所出现的所有不正常情况
错误:程序无法解决的问题(例如 文件读写时文件删除,网路中断,内存不够用了)

狭义上的: 运行时,由于程序缺陷导致在运行时出现不正正常情况,出现后程序可以控制,进行处理,程序继续执行。

本章主要针对狭义上的异常

对于这些异常,一般有两种解决方法:

​ 一是遇到异常就终止程序的运行。

​ 二是由程序员在编写程序时,就考虑到异常的检测、异常消息的提示,以及异常的处理。

异常的体系

Throwable类有两个直接子类:Exception类、Error类。

Error表示错误,可能是编译期错误或者系统错误,往往程序中并不处理。

Exception表示异常,是所有异常类的父类,是程序员所关心的。

异常分为运行期异常和编译期异常两种

运行期异常:程序运行时抛除的异常,所有RuntimeException的子类都 是运行期异常 :数组越界,数字格式化,空指针,类类型转换,算数异常…

       //数组越界
        Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	     at com.ff.javaexception.day1.ExceptionDemo.main(ExceptionDemo.java:7)

        int[] a = {1,2,3,4,5};
         a[5] = 5;

       StringIndexOutOfBoundsException
        String s = "abc";
        s.charAt(3);

        //java.lang.NumberFormatException  数字格式化异常
       Integer.parseInt("a");

       java.lang.NullPointerException 空指针异常
        String s = null;
        s.length();
        //java.lang.ClassCastException  类类型转换异常
        Object obj = "abc";
        Integer i = (Integer) obj;

         int a=10;
         int b=0;
         System.out.println(a/b);//算数异常 java.lang.ArithmeticException
         System.out.println("asssssssssssssssss");

编译期异常(Checked Exception):除去运行期的异常都是编译期异常, 也称为检测异常:IOException、SQLException ……

异常处理

Java编程语言使用异常处理机制为程序提供了错误处理的能力

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws


try{
可能会发生异常的代码
}catch(异常类型 引用名){
异常处理代码 
}finally{
必须执行代码
}
 try {
       "abc".charAt(4);

        int a = 10;
        int b = 2;
        int c = a / b;
        System.out.println(c);

       String s = "x";
       System.out.println(s.length());
            
      System.out.println("aaaaaaaaaaaa");
    }catch (ArithmeticException e){
        System.out.println("运算错误");
    }catch (NullPointerException n){//捕获与本catch类型相同的异常
        System.out.println("对象为空");
    }catch (Exception e){//大的类型 必须写在子类类型的下边
        System.out.println("出错啦");
    }

Finally

         try {
               可能出现异常的代码
           }catch(异常类型  e  用来接收抛出的异常对象){
                  捕获处理发生的异常
           }finally{
                   无论是否出现异常,代码都会执行
           }
            后续程序继续执行

如果没有catch:try+finally 一旦出现异常,会执行finally ,之后程序崩掉了

throws

throws,定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处理。

任何方法都可以使用throws关键字声明异常类型,包括抽象方法。

子类重写父类中的方法,子类方法不能声明抛出比父类类型更大的异常(针对编译期异常)。

public abstract class ExceptionDemo4 {
      
      abstract void eat() throws Exception;

}

public class Demo extends ExceptionDemo4 {

    /*
      方法重写父类方法
       返回值,方法名,参数必须一样
       访问权限修饰符 大于等于父类方法权限
       声明的异常必须小于或等于父类声明的异常
     */
    @Override
    public void eat() throws UnsupportedEncodingException,Exception {

    }
}

使用了throws的方法,调用时必须处理声明的异常,要么使用try-catch,要么继续使用throws声明。

        public static void main(String[] args) {
        try {
            test1();
        } catch (UnsupportedEncodingException e) {
            System.out.println("编码不支持");
        }catch (ParseException p){
            System.out.println("日期解析异常");
        }catch (NullPointerException n){
            System.out.println("对象为空");
        }
        System.out.println("aaaaa");
    }

    public  static void test1() throws UnsupportedEncodingException, ParseException {
        test2();
    }

    public  static void test2() throws UnsupportedEncodingException, ParseException {
        test3();
    }

    /*
    throws NullPointerException 运行时异常 声明为运行时异常,方法调用处可以处理也可以不处理
           UnsupportedEncodingException 声明为编译期异常,那么调用在编译期间必须处理
           一般情况下,throws后面一般都声明的是编译期异常明抛出
           一般情况下,位于底层的方法都选择向上声
     */
    public  static void test3() throws NullPointerException, UnsupportedEncodingException, ParseException {
           String s = "中国";
           s.getBytes("gbk");

        SimpleDateFormat sdf = new SimpleDateFormat("");
        sdf.parse("");
    }

throw

throw关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实 例化对象。

在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。

public static void main(String[] args) {
            //System.out.println(10/0);//由虚拟机在运行时出现异常,抛出一个此类的对象
            /*
            Exception in thread "main" java.lang.ArithmeticException: / by zero
	           at com.ff.javaexception.day2.ExceptionDemo5.main(ExceptionDemo5.java:7)
             */

            try {
                  subFileType(null);
            } catch (Exception e) {
                  e.printStackTrace();
                  System.out.println(e.getMessage());
            }

      }


      public static String subFileType(String fileName){
            if(fileName==null){
                //在方法体中,主动显示的抛出一个对用的异常对象,告知(通知)方法调用处,传入的数据有问题
               throw new NullPointerException("文件名为null了");
            }
         return fileName.substring(fileName.lastIndexOf(".")+1);
      }
public class Test {

    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList(3);
        arrayList.add(11);
        arrayList.add(11);
        arrayList.add(11);
        arrayList.add(11);
        try {
            score(-10);
        } catch (ScoreException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }


    public static  String score(double score) throws ScoreException {
             if(score<0){
                throw  new ScoreException("分数小于0了");
             }
             if(score>100){
                 throw  new ScoreException("分数大于100了");
             }
             if(score>=90){
                 return "A";
             }
             return "D";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值