zoukankan      html  css  js  c++  java
  • java 异常

    异常

    java的异常层次结构

    Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误.引用程序不应该抛出这种类型的对象.如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了.

    在设计Java程序时,需要关注Exception层次结构.这个层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常.划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常.
        
    派生于RuntimeException的异常包含下面几种情况:
        1.
    错误的类型转换

        2.
    数据访问越界
        3.
    访问空指针

       
    不是派生于RuntimeException的异常包括:
        1.
    试图在文件尾部后面读取数据
        2.
    试图打开一个不存在的文件
        3.
    试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在
    .
        "
    如果出现RuntimeException异常,那么就一定是你的问题"是一条相当有道理的规则.应该通过检测数组下标是否越界来避免ArrayIndexOutOfBoundsException异常;应该通过在使用变量之前检测是否为空来杜绝NullPointerException异常的发生.
        Java
    语言将派生于Error类或RuntimeException类的所有异常称为未检查异常,所有其他的异常称为已检查异常.

    RuntimeException这个名字很容易让人误解,他并不是运行时异常的意思。

     

    调用一个抛出了已检查异常的方法,编译器必须要处理这个异常,要么捕获,要么抛出。

    调用一个未检查异常方法,编译器不要求必须处理这个异常。如下:

    红线是编译报错,需要捕获异常才可以。

    想象一下为什么我们经常在代码中抛出runtimeexception?

    为什么我们不需要捕获未检查异常?

    因为大部分情况下未检查异常一般是程序错误,超出了我们的处理范围。应该在程序编写期间,就避免这种异常,而不是把它抛出给上层。比如我们需要处理ArrayIndexOutOfBoundsException异常吗,不需要,这是在编码阶段就需要避免出现的问题。

    如果要覆盖一个超类的方法,那么子类方法抛出的已检查异常不能超过超类中已检查异常的范围。也就是说,只能抛出更少的已检查异常。或者超类中已检查异常的子类。

    为什么?因为我们在调用parent.f()的时候,编译器会要求我们捕获它抛出的已检查异常,但是运行时这个parent可能指向了一个child,如果child的对应方法可以抛出更多的异常,编译器根本识别不到。

     

     

  • 相关阅读:
    【leetcode】Binary Search Tree Iterator
    【leetcode】Palindrome Partitioning II
    【leetcode】Best Time to Buy and Sell Stock III
    【leetcode】Best Time to Buy and Sell Stock II
    【leetcode】Longest Consecutive Sequence
    【leetcode】Factorial Trailing Zeroes
    【leetcode】Simplify Path
    【leetcode】Generate Parentheses
    【leetcode】Combination Sum II
    【leetcode】Combination Sum
  • 原文地址:https://www.cnblogs.com/xiaolang8762400/p/7045950.html
Copyright © 2011-2022 走看看