异常(Exception)

一、什么是异常?

异常就是程序中的错误,比如数组越界、访问空指针等。在Java中,一切皆对象,异常也不例外。所有的异常都是派生于Throwable类的一个实例对象。

二、异常的分类

在异常界,有两大流派。一派叫Error类,另一派叫Exception类,它们都继承自Throwable类。在Exception类下还有两大分支,IOException类和RuntimeException类。

RuntimeException是由程序本身的错误导致的异常。

IOException是程序本身没有问题,但是因为IO发生的错误引起的异常。

举例:

RuntimeException(unchecked)

IOException(checked)

数组访问越界

试图打开一个不存在的文件

访问空指针

试图在文件尾部读取数据

错误的类型转换

RuntimeException类和它的叔叔Error类比较亲,叔侄俩统称为未检查异常(unchecked Exception),大白话就是不用你检查,不用你管的异常。而IOException和它的兄弟和叔叔明显不是一路的,被称为已检查异常(checked Exception),就是你得管它。

三、异常处理(Exception handing)

前面说过未检查异常不用我们管,所以这里就只说我们怎么对付已检查异常。

(1)throws

 首先,你得声明它。方法应该在其首部用throws+异常名声明所有可能抛出的异常。

  抛出异常的4中情形:

  1.调用一个抛出已检查异常的方法。

  2.程序运行过程中发现错误,并且利用throws语句抛出已检查异常

  3.程序出现错误,比如数组访问越界,会自动抛出ArrayIndexOutOfBoundsException

  4.Java虚拟机和运行时库出现的内部错误

  举个例子:

 Class MyAnimation{
     public Image LoadImage(String s)throws IOException, EOFException
     {
     ......
     }
 }

(2)用throw关键字抛出异常

 String readData(Scanner in)throws EOFException{
     ...
     while(...){
         if(!in.hasNext())
         {
             if(n<len)
             throw new EOFException();
         }
     }
 }        

(3)自定义异常

当java提供的异常满足不了需要的时候,可以自己DIY一个

 //定义一个FileFormatException类
 class FileFormatException extends IOException{
     public FileFormatException(){}
     public FileFormatException(String gripe){
         super(gripe);
     }
 }
 //下面抛出自定义异常
 String readData(Scanner in)throws EOFException
 {
     ...
     while(...){
         if(ch == -1){
             if(n<len)
             throw new FileFormatException();
         }
     }
     return s;
 }    

(4)捕获异常

光把异常抛出去,不能不管啊,所以就得捕获它并处理它。

 //利用try-catch语句块捕获异常
 try{
     code
 }
 catch(ExceptionType e){
     handler for this type
 }

  如果在try语句块中的代码抛出了一个在catch子句中说明的异常类,那么

  1)程序将跳过try语句块的其他代码。

  2)程序将执行catch子句中的处理器代码

(5)异常-方法内外

  对于异常,可以在方法内部用try-catch语句块来捕获并处理,如果不想在方法内处理,可以在方法首部声明可能抛出的异常,将异常可能抛出的异常交给调用方法的代码去处理。总之,就是方法内用try-catch处理,方法外用throws抛出。

(6)捕获多个异常

 try{
     code
 }
 catch(FileNotFoundException | UnknowHostException e){
     ...
 }
 catch(IOException e){
     ...
 }

(7)finally

 try{
     ...
 }
 catch(IOException e){
     ...
 }
 finally{
     ...
 }

不管有没有异常发生,finally语句块中的代码都将执行。

try-catch、try-catch-finally、try-finally三种组合,1、3组合更常用

(8)带资源的try语句块

带资源的try块在退出时,会自动关闭资源,这样往往就可以省掉finally语句

 try(Scanner in = new Scanner(new FileInputStream(“文件路径”))){
     while(in.hasNext())
     System.out.println(in.next());
 }

注:╮(╯▽╰)╭本文大量参考《Java核心技术 卷I》

Java学习日记9-异常的更多相关文章

  1. Java学习日记基础篇(九) —— 集合框架,泛型,异常

    集合框架 有事我们会需要一个能够动态的调整大小的数组,比如说要添加新员工但是数组已经满了,并且数组的大小是在定义的时候定死的,所以我们就需要一个能够动态调整大小的数组或者用链表解决,而java中提供了 ...

  2. 1.13(java学习笔记)异常机制

    异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...

  3. Java学习日记基础(五)——类、对象之this、静态变量(类变量)、静态方法(类方法)、四大特征

    this 赵本山问奥尼尔:“我的爸爸的爸爸是谁?” 奥尼尔:“不知道” 赵本山:“你傻啊,是我爷爷” 奥尼尔回去问科比:“我的爸爸的爸爸是谁?” 科比:“不知道” 奥尼尔:”你傻啊,是赵本山的爷爷“ ...

  4. Java学习日记之 Java-其他类型

    OK , 就绪, 第一篇博客开撸 ~ 先听了毕姥爷激情澎湃的其他类型 ,从这里开始入手吧 : (一)System类  System类代表系统类,系统的属性和方法都放在该类.System类是一个fina ...

  5. java学习面向对象之异常之二

    我们知道当我们处理异常的时候,一个是声明,另外一个是捕捉. 捕捉:异常处理的捕捉方式,这是可以对异常进行针对性处理的方式.具体格式是: try { //需要被检测的异常 } catch(异常类 变量) ...

  6. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  7. Java学习日记-2.5 关于0和无穷

    1. 无穷 Java中将无穷定义为浮点数,分为正负无穷,分别为POSITIVE_INFINITY和NEGATIVE_INFINITY 2. null null在java中可以理解为一个特殊的引用类型, ...

  8. Java学习日记-11 集合(1)

    Collection接口集合中存储的只是对象的引用,不是对象本身. 1.ArrayList<E>类1.1ArrayList和Collection的关系 public interface L ...

  9. Java学习日记-2 零零碎碎

    一.使用Scanner类进行控制台的输入 文档中Scanner类的定义为A simple text scanner which can parse primitive types and string ...

随机推荐

  1. stl_alloc.h

    /* * Copyright (c) 1996-1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, ...

  2. Html----常见标签

    文本格式化标签 标签 描述 <b> 定义粗体文本. <big> 定义大号字. <em> 定义着重文字. <i> 定义斜体字. <small> ...

  3. Linux开发工具之gcc

    一.gcc入门(上)   1.gcc相关概念   gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C.C++.Java.Pascal.Ada.COBOL语言等:支持多种硬件平台: ...

  4. Android开发技巧——去掉TextView中autolink的下划线

    我们知道,在布局文件中设置textview的autolink及其类型,这时textivew上会显示link的颜色,并且文字下面会有一条下划线,表示可以点击.而在我们在点击textview时,应用将根据 ...

  5. vijos P1375 大整数(高精不熟的一定要做!)

    /* 我尼玛这题不想说啥了 亏了高精写的熟..... 加减乘除max都写了 高精二分 */ #include<iostream> #include<cstdio> #inclu ...

  6. WIN10FTP服务器搭建

    在WIN10上搭建FTP服务器 先建立两个文件夹,区分上传和下载,做测试 用 然后在管理--服务界面新建一个用户 用户目录下创建一个用户 因为服务应用程序里面没有IIS,所以我们打开控制面板里面的程序 ...

  7. 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口

    //继承thread类 class PrimeThread extends Thread{ long minPrime; PrimeThread(long minPrime) { this.minPr ...

  8. 静态html传参数

    记下来备忘 a.html <html> <head> <body> <a href="c.html?test=大师大师" target=& ...

  9. 说说RMAN里的obsolete

    RMAN> report obsolete; RMAN retention policy will be applied to the commandRMAN retention policy ...

  10. Android单位度量

    px(像素):屏幕上的点. in(英寸):长度单位.mm(毫米):长度单位.pt(磅):1/72英寸.dp(与密度无关的像素):一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp = 1p ...