异常的探讨

Posted Al_tair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常的探讨相关的知识,希望对你有一定的参考价值。

异常的探讨

大家好呀!我是小笙!我学习了韩顺平老师的类和对象的知识,收获颇丰!现在来和大家分享笔记!

异常

基本概念

概念: 将程序执行中发生的不正常情况(语法错误和逻辑错误不是异常)

public class Exception01 
    /*
     * 异常
     * 分两大点 Error & Exception
     * Error: 严重错误,程序奔溃 例如:java虚拟机无法解决的严重问题
     * Exception:偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理
     * Exception 可以分为 运行时异常 和 编译时异常
     */
    public static void main(String[] args) 
        int num1 = 10,num2 = 0;
        /*
         * Exception in thread "main" java.lang.ArithmeticException: / by zero
         *     at com.Al_tair.exception_.Exception01.main(Exception01.java:14)
         */
        // int div = num1/num2; 异常

        try 
            int div = num1/num2;
         catch (Exception e) 
            e.printStackTrace();
        
        System.out.println("~~~"); // 会继续运行
    

异常的体系图

异常分为两大类:运行时异常,编译时异常

  • 运行时异常,编译器不要求强制处置的异常(一般是逻辑错误)
  • 编译时异常是编译器要求必须处置的异常

运行时异常

运行时异常,编译器不要求强制处置的异常(一般是逻辑错误)

空指针异常

NullPointException :当应用程序在需要使用对象的地方使用null,抛出该异常

// 实例
class NullPointException
    public static void main(String[] args) 
        String name = null;
        System.out.println(name.length()); // NullPointerException
    

数字运算异常

ArithmeticException:当出现异常运算条件时,抛出异常

// 实例
class ArithmeticException 
    public static void main(String[] args) 
        int num1 = 10,num2 = 0;
        int div = num1/num2; // ArithmeticException
    

数组下标越界

ArrayIndexOutOfBoundsException:用非法索引访问数组的异常

// 实例
class ArrayIndexOutOfBoundsException 
    public static void main(String[] args) 
        int[] array = new int[3];
        System.out.println(array[3]); //ArrayIndexOutOfBoundsException
    

类型转换异常

ClassCastException:当试图将对象强制类型转换为不是该实例的子类,抛出该异常

// 实例
class ClassCastException 
    public static void main(String[] args) 
         A b = new B();
         C c = (C)b; // ClassCastException
    

class A
class B extends A
class C extends A

数字格式不正确异常

NumberFormatException:当应用程序试图将字符串转换成一种数值类型,将抛出该异常

// 实例
class NumberFormatException 
    public static void main(String[] args) 
        String name = "";
        int num = Integer.parseInt(name); // NumberFormatException
    

编译异常

编译时异常是编译器要求必须处置的异常

异常处理

两种处理方式

  • try - catch - finally 程序员在代码中捕获异常,自行处理

  • throws 将异常抛出,交给调用者来处理,最顶级处理者JVM

    • 运行时异常:如果没有处理,默认throws的方式处理

    • 编译时异常:程序必须抛出异常或者处理异常,并且当子类重写父类的方法时,对抛出的异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一样,要么为父类抛出异常的子类型

      class Father
          public void methos() throws RuntimeException
      
      
      class Son extends Father
          @Override
          public void methos() throws NullPointerException
              super.methos();
          
      
      

try - catch - finally格式:

try
    // 代码可能有异常
    // 如果没有出现异常,则执行try块中所有的语句,反之有出现异常,则不再执行try块中剩余的语句
catch()
    // 捕获到异常
    // 1.当异常发生时,才会执行catch内的代码
    // 2.系统将异常封装成Exception对象e,传递给catch
finally
    // 不管是否有异常,都会执行


// 注意细节
// 可以有多个catch语句进行捕获不同的异常,要求子类异常在父类异常之前,不然就没有子类异常存在的意义
// 可以进行try-finally配合使用,不进行其他异常捕获(包括throws),不管是否有异常都执行某些语句,然后程序退出

throws 抛出形式:

习题一

当异常处理后需要返回数据,catch和finally中都有return语句,最终返回的数据是finally中的数据

习题二

自定义异常

继承Throwable的子类或者间接子类

运行时异常通常继承RuntimeException;编译时异常通常继承Exception

// 例子
class test
    public static void main(String[] args) 
        int age = 208;
        /*
         * Exception in thread "main" com.Al_tair.exception_.AgeJudge: 不符合年龄
         * 	at com.Al_tair.exception_.test.main(Exception01.java:71)
         */
        if(!(age >= 0 && age <= 140))
            throw new AgeJudge("不符合年龄");
        
    

class AgeJudge extends RuntimeException
    public AgeJudge(String message) 
        super(message);
    

throws VS throw

意义位置后面的语句
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象

相关面试题

1.请说明JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。

Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。throw语句用来明确地抛出一个”异常”。throws用来标明一个成员函数可能抛出的各种”异常”。Finally为确保一段代码不管发生什么”异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,”异常“的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。

以上是关于异常的探讨的主要内容,如果未能解决你的问题,请参考以下文章

python 这意味着无论何时引发未捕获的异常,我都会立即得知发生了什么(完全回溯)。

Java基础之异常

在模块 ExpoPushTokenManager 上执行导出方法 getDevicePushTokenAsync 时发生异常

发生了第一次机会异常......我不知道为啥

Windows2016副本服务技术探讨

在c#中使用单一方法会发生***异常吗?