zoukankan      html  css  js  c++  java
  • Java基础—异常

    Java异常概念

    Throwable: 

    • 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
    • Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。

    Error(错误):

    • Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。 
    • 编译器不会检查Error

    Exception(异常):

    • Exception是程序本身可以处理的错误,这种异常分两大类运行时异常(非检查异常)非运行时异常(检查型异常)。程序中应当尽可能去处理这些异常。 

    RuntimeException(运行时异常):

    • 运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。
    • 这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

    非运行时异常:

    • Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于非运行时异常。
    • 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。

    异常处理

    Java异常机制用到的几个关键字:try、catch、finally、throw、throws。
    • try        -- 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
    • catch   -- 用于捕获异常。catch用来捕获try语句块中发生的异常。
    • finally  -- finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
    • throw   -- 用于抛出异常。
    • throws -- 用在方法签名中,用于声明该方法可能抛出的异常。

    下面通过几个示例对这几个关键字进行简单了解。

    示例一: 了解try和catch基本用法

    复制代码
    public class Demo1 {
    
        public static void main(String[] args) {
            try {
                int i = 10/0;
                  System.out.println("i="+i); 
            } catch (ArithmeticException e) {
                  System.out.println("Caught Exception"); 
                System.out.println("e.getMessage(): " + e.getMessage()); 
                System.out.println("e.toString(): " + e.toString()); 
                System.out.println("e.printStackTrace():");
                e.printStackTrace(); 
            }
        }
    }
    复制代码

    运行结果

    Caught Exception
    e.getMessage(): / by zero
    e.toString(): java.lang.ArithmeticException: / by zero
    e.printStackTrace():
    java.lang.ArithmeticException: / by zero
        at Demo1.main(Demo1.java:6)

    结果说明:在try语句块中有除数为0的操作,该操作会抛出java.lang.ArithmeticException异常。通过catch,对该异常进行捕获。
    观察结果我们发现,并没有执行System.out.println("i="+i)。这说明try语句块发生异常之后,try语句块中的剩余内容就不会再被执行了。

    示例二: 了解finally的基本用法

    在"示例一"的基础上,我们添加finally语句。

    复制代码
    public class Demo2 {
    
        public static void main(String[] args) {
            try {
                int i = 10/0;
                  System.out.println("i="+i); 
            } catch (ArithmeticException e) {
                  System.out.println("Caught Exception"); 
                System.out.println("e.getMessage(): " + e.getMessage()); 
                System.out.println("e.toString(): " + e.toString()); 
                System.out.println("e.printStackTrace():");
                e.printStackTrace(); 
            } finally {
                System.out.println("run finally");
            }
        }
    }
    复制代码

    运行结果

    复制代码
    Caught Exception
    e.getMessage(): / by zero
    e.toString(): java.lang.ArithmeticException: / by zero
    e.printStackTrace():
    java.lang.ArithmeticException: / by zero
        at Demo2.main(Demo2.java:6)
    run finally
    复制代码

    结果说明:最终执行了finally语句块。

    示例三: 了解throws和throw的基本用法

    throws是用于声明抛出的异常,而throw是用于抛出异常。

    复制代码
    class MyException extends Exception {
        public MyException() {}
        public MyException(String msg) {
            super(msg);
        }
    }
    
    public class Demo3 {
    
        public static void main(String[] args) {
            try {
                test();
            } catch (MyException e) {
                System.out.println("Catch My Exception");
                e.printStackTrace();
            }
        }
        public static void test() throws MyException{
            try {
                int i = 10/0;
                  System.out.println("i="+i); 
            } catch (ArithmeticException e) {
                throw new MyException("This is MyException"); 
            }
        }
    }
    复制代码

    运行结果

    Catch My Exception
    MyException: This is MyException
        at Demo3.test(Demo3.java:24)
        at Demo3.main(Demo3.java:13)

    结果说明
      MyException是继承于Exception的子类。test()的try语句块中产生ArithmeticException异常(除数为0),并在catch中捕获该异常;接着抛出MyException异常。main()方法对test()中抛出的MyException进行捕获处理。

    参考:

    Java异常(一) Java异常简介及其架构

    Java异常体系结构

  • 相关阅读:
    JavaWeb_Tomcat_Maven!
    java异常!
    JavaWeb获取web.xml初始参数!getInitParameter
    JavaWeb文件下载!
    Java抽象接口!
    JavaWeb初识Servlet!
    关于HashMap以对象作为Key的实现及踩坑
    浅析.Net下的多线程编程(2)
    获取浏览器分辨率
    浅析.Net下的多线程编程(1)
  • 原文地址:https://www.cnblogs.com/Jason-Xiang/p/7389343.html
Copyright © 2011-2022 走看看