• JAVA基础知识|异常


    一、基础知识

    处理异常,java提供了一个优秀的解决方案:异常处理机制。

    java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception。

    java异常体系结构图如下:

    Error类:这类异常由java虚拟机生成并抛出,大多数错误与代码编写者无关,不能被程序员通过代码来处理。发生这种异常时,java虚拟机一般会选择关闭线程。Error异常很少出现,所以我们更应该关注Exception分支下异常。

    Exception类:这类异常通常可以被程序处理,也是我们需要关注的重点。

    根据javac对异常处理的要求,我们可以将异常分为两类:

    非受查异常:java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查异常。javac在编译时,不会提示和发现这类异常,不要求在程序中处理这些异常。这样的异常多半是代码写的有问题,比如除零、数组越界、空指针异常等。

    受查异常:除了Error类或RuntimeException类的所有异常。javac在编译时,会检查这类异常,要么通过try-catch语句进行捕获,要么通过throws语句进行抛出,否则编译不通过。

    需要明确的是受查和非受查是对于javac而言的,非受查异常为编译器不要求强制处理的异常,受查异常则是编译器必须处理的异常。

     二、异常处理机制

     异常处理机制的本质是抛出异常捕获异常。

    2.1、抛出异常

    有些异常,我们不知道该如何处理或者说交给调用者处理更好。我们就需要将这种类型的异常抛出,交给上一级去处理,或者可以继续抛出,交给更高一级的调用者去处理。

    抛出异常有两个关键字:throwthrows

    throws:抛出方法中可能导致的异常,这个异常并不一定发生。这有利于调用者及时处理这些可能发生的异常,保护自己的程序。方法中抛出的所有受查异常,必须通过throws子句抛出,否则会导致编译错误。

    语法:

    public void method throws EOFException,FileNotFoundException,...{
        //method body
    }

    【示例】

    public class AppTest extends TestCase {
    
        @Test
        public void test() {
            try {
                checkedTest();
            } catch (FileNotFoundException e) {
                System.out.println("未找到文件!");
            }
        }
    
        public void checkedTest() throws FileNotFoundException {
            FileInputStream fileIn = new FileInputStream("E:\a.txt");
            System.out.println("FileInputStream抛出受查异常");
        }
    }

    throw:抛出明确的异常,throw后面的任何语句不会被执行,

     语法:

    throw new Exception();

    【示例】

    public class AppTest extends TestCase {
    
        @Test
        public void test() {
            throwTest(null);
        }
    
        public void throwTest(String input) {
            if (input == null) {
                throw new NullPointerException();
            }
        }
    }

    2.2、捕获异常

     语法:

    try{
    //可能出现异常的代码
    }catch(SQLException e){
    
    }catch(Exception e){
    
    }finally{
    
    }

    这里有几点需要注意:

    1)如果代码可能抛出多种异常,相应的我们也要使用多个catch子句进行捕获。当异常发生时,每个catch子句会被依次检查,当第一个匹配的子句被执行时,捕获结束,其他的子句将不会再检查。所以这里有一个重要原则:先子类后父类

    2)finally子句是可选项,可有可无。无论出不出现异常,finally都会在try/catch之后执行。

    • 不要再finally里使用return,会覆盖前面的返回值。
    • 不要在finally里抛出异常,会抑制前面抛出的异常。
    • 尽量不要再finally里做其他事,finally仅仅用于释放资源最合适。
    • 尽量将所有的return写在方法的最后,不要写在try/catch/finally中。

    三、异常分析

    【示例】

    public class Java8Tester {
        public static void main(String args[]) {
            throwTest(null);
        }
    
        public static void throwTest(String input) {
            if (input == null) {
                throw new NullPointerException();
            }
        }
    }

    结果:

    Exception in thread "main" java.lang.NullPointerException//异常线程,异常类型
        at com.my.Java8Tester.throwTest(Java8Tester.java:16)//异常抛出点
        at com.my.Java8Tester.main(Java8Tester.java:11)//调用方法
  • 相关阅读:
    前后端分离的若依(ruoyi)基本使用
    Redis (error) NOAUTH Authentication required.解决方法
    Creating Server TCP listening socket 127.0.0.1:6379: bind: No error。。。启动遇到问题的解决办法
    持续集成
    Java compiler level does not match the version of the installed Java project facet问题解决
    控制台报错:Unknown database 'xxxxx'
    走进docker-machine
    走进docker-compose
    java新手学习路线
    Spring WebFlux 教程:如何构建反应式 Web 应用程序
  • 原文地址:https://www.cnblogs.com/maikucha/p/8573240.html
Copyright © 2020-2023  润新知