zoukankan      html  css  js  c++  java
  • 异常

    异常:
    程序正常情况下是可以运行的,只是偶然因为其他的原因,导致“异常”情况。
    例如:用户输入参数的问题,用户文件被删除,用户的磁盘空间已满,网络中断。
    程序的运行过程中,可能遇到了“不正常”的情况,导致程序暂停或崩溃了。

    不是异常的情况:
    (1)语法错误,编译都不能通过
    (2)逻辑错误

    Java如何处理异常?或者Java的异常处理机制是什么样?
    Java程序运行过程中,如果某句代码发生异常,Java会在这句代码处停下来。
    Java会创建一个“异常的对象”并且“抛”出来。
    Java会检测在这句代码的外围是否有“try...catch”可以“捕获”它,
    》如果可以“捕获”它,那么程序会从这个try...catch后面继续往下执行。
    》如果外围没有“try...catch”可以“捕获”它,那么程序就会先抛给“上级(调用者)”,上级也会检测是否有“try...catch”可以“捕获”它,如果可以“捕获”它,那么程序就会从这个try...catch后面继续往下执行。
    》如果一路上都没有“try...catch”可以“捕获”它,那么程序就“挂了”。

    异常的父类:java.lang.Throwable
    Throwable类是Java语言中所有错误或异常的超类。

    Throwable:
    (1)Error:Error是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
    (2)Exception
    又分为两大类:
    A:RuntimeException运行时异常(非受检异常),只有RuntimeException类型或它的子类是属于运行时异常。
    凡是运行时异常,编译器不会要求你必须添加“try...catch”或“throws”

    常见的运行时异常:
    ArrayIndexOutOfBoundsException(数组下标越界)
    NullPointerException(空指针异常)
    ClassCastException(类型转换异常)
    ArithmeticException(算术异常)

    B.编译时异常(受检异常):除了运行时异常,剩下的全部是编译时异常。
    凡是编译时异常,编译器强制要求你必须加“try...catch”或“throws”之一,否则编译不通过。
    常见的编译时异常:
    InterruptedException:线程中断打扰的异常
    FileNotFoundException:文件找不到

    面试题:
    1.编写代码,使得发生VirtualMachineError
    2.列出你开发中常见的异常类型(至少5个以上)

    列出几种运行时异常

    列出几种编译时异常
    (OutOfMemoryError,StackOverflowError)
    StackOverflowError错误的示例:
    public class TestExceptionType{

    @Test
    public void test(){
    FileInputStream fis = new FileInputStream("");//导包之后,还是会报错,需要加上“try...catch”或“throws”来处理,编译才不会报错。FileNotFoundException。
    }

    @Test
    public void test() throws InterruptedException{
    Thread.sleep(1000);//不处理就会报InterruptedException,加上throws就不会在编译时报错了
    }

    @Test
    public void testRuntimeException(){
    int[] arr = new int[5];
    System.out.println(arr[6]);//ArrayIndexOutOfBoundsException
    String str = null;
    System.out.println(str.length());//NullPointerException
    System.out.println(9/0);//ArithmeticException
    }

    @Test
    public void testOutOfMemoryError(){
    Object[] arr = new Object[Integer.MAX_VALUE];
    System.out.println(arr.length);
    }

    @Test
    public void testStackOverflowError(){
    testStackOverflowError();
    }
    }

    异常处理:try...catch
    1.语法结构
    try{
    可能发生异常的代码
    }catch(异常的类型1 异常名称){
    捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
    }catch(异常的类型2 异常名称){
    捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
    }catch(异常的类型2 异常名称){
    捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
    }
    。。。。。。。

    说明:多个catch有要求,必须是小的异常类型在上面,大的异常类型在下面,如果没有大小关系,就随意。这里的小和大是继承关系,子类小于父类。

    2.执行的特点
    (1)如果try中的代码没有发生异常,只执行try中的代码,不会执行catch。
    (2)如果try的代码发生异常
    》有catch可以捕获它,那么哪个catch捕获就进入哪个catch继续执行,按顺序找catch。只会执行其中一个catch。
    如果catch住了,那么会从try...catch继续执行
    》所有的catch都无法捕获它,那么自动往“上”抛
    如果没有catch住,当前方法就结束了,带着“异常”回到上一级调用的位置。

    命令行参数:是指给main的形参赋值的实参
    如何传:(1)java TestParam chai lin yan
    此方法是在cmd的命令行中,先使用javac TestParam.java进行编译,然后再进行 运行时,加上实参传递,格式为java TestParam chai lin yan
    (2)在eclipse中,Run菜单--》Run Configurations
    Java Application中找到操作类所在包以及所操作类,找到arguments菜单,在Program arguments栏中输入参数。

    Integer.parseInt(++);把++字符串转成一个整数。


    异常处理:try...catch...finally
    1.语法结构
    try{
    可能发生异常的代码
    }catch(异常的类型1 异常名称){
    捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
    }catch(异常的类型2 异常名称){
    捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
    }catch(异常的类型2 异常名称){
    捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
    }
    。。。。。。
    finally{
    无论try中是否发生异常,也不管catch是否可以捕获异常,都要执行的代码块。
    }

    2.try...catch的形式
    (1)try...catch
    (2)try...catch...finally
    (3)try...finally

    面试题1:
    final,finalize,finally的区别?
    final:是修饰符,可以修饰类(不能被继承)、方法(不能被重写)、属性(不能被更改)
    finalize:是一个Object中声明的方法,表示由垃圾回收器GC调用,在对象被回收之前调用。
    finally:是try...catch结构的一部分,无论try中是否发生异常,也不管catch是否可以捕获异常,都要执行的代码块。

    面试题2:
    当finally和return一起时出现的情况:
    (1)情况一:finally里面有return,结果就返回finally中的
    (2)情况二:finally里面没有return,结果就返回try或者catch。

    说明:一般情况下不建议在finally中写return,因为这样的话,try或者catch中的return就失效了。

    throws:
    用在声明一个方法时,明确声明该方法可能抛出++异常。说明这些异常在该方法中没有try...catch,抛由调用者处理。

    语法格式:
    【修饰符】 返回值类型 方法名(【形参列表】) 【throws 一场列表】{}

    说明:throws后面可以接多个异常,顺序无所谓,一般如果有父类的异常,子类就不写。

    如果抛出的是编译时异常,则调用者必须用try。。。catch处理,或者调用者继续抛出。

    throws与方法重写:
    方法的重写(Override)的要求:
    (1)方法名:必须相同
    (2)形参列表:必须相同
    (3)返回值类型:
    基本数据类型和void:必须相同
    引用数据类型:<=
    (4)权限修饰符:>=
    (5)抛出的异常列表的类型:<=

    异常关键字throw:throw是用于主动抛出异常对象。
    异常对象:
    (1)JVM检测到程序中的异常,就自动创建异常对象抛出
    (2)程序员手动抛出异常
    无论是JVM自动抛出还是throw手动抛出,最终都用try。。。catch处理或者通过throws抛给上级。

    语法格式:
    语句:throw 异常对象;
    说明:如果没有try。。。catch,它可以代替return语句,结束当前方法,但是无法返回正常的结果,只能带回异常对象。

    一个方法中可以有多处抛出同类型的编译时异常,然后在此方法的上级做处理。
    如果抛出运行时类型,会通过编译。IDE不会强制要求你处理异常。

    需求:从键盘输入用户名,密码,校验码
    Exception:
    (1)构造器:可以给message的属性赋值
    new Exception("校验码输入错误");
    (2)String getMessage()
    (3)printStackTrace():打印异常的堆栈信息。
    专门的打印错误信息的:System.err.print(),此方法打印出来的信息是红色的。
    System.out.print(),此方法打印出来的信息是黑色的。

    Java中都讲究“见名知意”。

    自定义异常的要求
    1.Throwable类是Java语言中所有错误或异常的超类,只有当对象是此类(或其子类之一)的实例时,才能通过Java虚拟机或者Java throw语句抛出。
    类似的,只有此类或其子类之一才可以是catch语句中的参数类型。

    结论:要想一个类称为“异常类型”,必须继承Throwable或它的子类。

    2.自定义异常的对象,只能由throw语句手动抛出。

    3.建议自定义异常,增加两个构造器
    (1)无参构造器尽量保留
    (2)有参构造:异常类型(String message),可以为message属性赋值

  • 相关阅读:
    java学习 接口与继承11 默认方法
    java学习 接口与继承10 内部类
    java学习 接口与继承9 抽象类
    java学习 接口与继承8 final
    理解管理信息系统
    vue中的错误日志
    vue中的ref属性
    2.有24颗外观完全一样的小球,其中有一个是空心的,现在只有一个天平,最少称几次能找出这个特殊的球?
    1.有888瓶编了号码的水及10只健康的小白鼠,其中一瓶水有毒,小白鼠饮用毒水一天后会死,最少需要几天可以找到哪瓶水有毒?
    SQL题1两表联查
  • 原文地址:https://www.cnblogs.com/1185937986-jili/p/12886173.html
Copyright © 2011-2022 走看看