文档章节

Java基础知识学习:异常

Java工程师-10
 Java工程师-10
发布于 2016/10/25 14:57
字数 1352
阅读 14
收藏 0

当异常发生时,原本要接着执行的代码不再执行,转而让其他部分的代码来处理。如果没有代码负责处理,控制台会报告异常。

异常出现时的 执行机制 : 
图片描述
异常机制最大的好处是:清晰地分开了 正常的业务逻辑 和 遇到情况时的处理 代码。(当在业务逻辑中,有多步可能会抛出不同的异常时,异常处理机制的好处更得以体现。如果没有这种机制,也许会通过很多的if…else…来实现异常处理,甚至是多层嵌套的if…else…,这样的代码可读性很差)

通过例子来理解:

package exception;

public class ExceptionCatch {
   public static void main(String[] args) {
     try {
       //我们通过抛出异常来抽象真实的业务逻辑,可能某一步会出现异常,这时下面的代码就不再执行,转而到处理代码。
        //执行完处理代码之后不会再回到之前try里没执行完的代码继续执行,而是去往下执行try{}catch{}之后的代码。
            throw new NullPointerException(); 
            throw new ArrayIndexOutOfBoundsException();
        throw  ...                    
        }catch(NullPointerException e) {
         //异常处理代码
        }catch(ArrayIndexOutOfBoundsException e) {
        //异常处理代码
     }catch(Exception e){
       //异常处理代码
       }
   }
}

捕捉到异常之后怎么处理?

当catch到一场之后,根据你的业务逻辑来对它进行处理,比如说可以弹出一个窗口来警告用户发生了错误,或者让程序自己重新执行或者终止掉等等。当然,如果现在处理不了这个异常,也可以将它再次抛出。

处理完异常之后是回不到异常发生的地方继续执行一下的代码了,而是从catch{}后面的代码开始执行。

一个异常只能被捕捉一次,捕捉之后这个异常就没有了。不可能再次捕捉到。

自定义异常类的构造器与 getMessage()方法的使用 :

 1 package exception;
 2 
 3 //注意观察两个异常类构造器的区别。

  /**
   * 推断:
   * 第一个异常类是自己定义了一个String变量,在构造的时候是将信息传给了这个变量;
   * 而第二个异常类的构造器是覆盖了父类的构造方法,所以我们猜测,父类Exception里一定有一个String类型的成员变量(这个成员变量同样继承给了MyException子类),
   * 所以在构造的时候利用super()将父类的构造方法取过来,进而将信息传给了父类里的那个String成员变量。
   * 而getMessage()方法也是从父类那里继承来的,进而我们推断:getMessage()方法返回的正是那个String变量。
   * 在第一个异常类的那个从父类继承的String变量并没有被赋值,所以通过getMessage()取到的是null。
   */
 4 class MyException extends Exception {
 5     String msg;
 6     public MyException(String msg) {
 7         this.msg = msg;
 8     }
 9     public void printMsg() {
10         System.out.println("msg = " + msg);
11     }
12 }
13 
14 class MyException2 extends Exception {
15     public MyException2(String s) { 
16         super(s); 
17     }
18 }
19 
20 public class E04_ExceptionClass {
21     public static void main(String args[]) {
22         try {
23             throw new MyException("MyException message");
24         } catch(MyException e) {
25             e.printMsg();
26             System.out.println("e.getMessage() = " + e.getMessage()); //输出为null。
27         }
28         
29         try {
30             throw new MyException2("MyException2 message");
31         } catch(MyException2 e) {
32             System.out.println("e.getMessage() = " + e.getMessage());
33         }
34     }
35 }
36 /*Output:msg = MyException message
37  *       e.getMessage() = null
38  *       e.getMessage() = MyException2 message

printStackTrace()方法:堆栈跟踪

我们知道在程序代码执行的过程中,某个主线程可能会调用其他的代码程序,调用执行之后,回来继续执行主线程。这个过程中就需要堆栈来存储调用时的断点。(因为在嵌套调用的时候会需要存储多个断点,返回的时候再倒序依次返回,这要遵循后进先出的原则。) 
图片描述
堆栈跟踪便可以看成是对代码调用的跟踪,当异常发生时可以根据该异常的printStackTrace()方法,打印出 该异常的整个传递过程 。

一个方法里如果会抛出异常,则必须在其方法后面声明 throws 异常名 。如果不声明则必须在这个方法里通过 try{}catch{} 将异常处理掉。

一个方法可以声明多个异常抛出 throws 异常1 , 异常2 ,但是在以后调用该方法时必须有多个catch来捕捉不同的异常。 温馨提示:往往在编程时,会把所有可能会有的异常(现在会有的和以后可能会有的)全都声明在方法之后,这是一种习惯。因为在后期在对该方法进行功能扩展时可能会遇到出现这些异常,而当时在声明这些异常之后编译器会提示你将这些异常一一catch���所以这时你只需要填补catch里的处理内容,这会来带一定的便利。

下面是一个示例:

package exception;

class OpenException extends Throwable {}
class CloseException extends Throwable {}

public class c {
    public static int open() {
        return -1;
    }

    public static void readFile() throws OpenException,CloseException {
        if(open() == -1) throw new OpenException();
    }

    public static void main(String[] args) {
        try {
            readFile();
        } catch (OpenException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (CloseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

学习Java的同学注意了!!! 
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:454297367 我们一起学Java!

© 著作权归作者所有

上一篇: Java堆和栈的区别
下一篇: JVM 架构解读
Java工程师-10

Java工程师-10

粉丝 35
博文 4
码字总数 7530
作品 0
朝阳
高级程序员
私信 提问
给Java新手的一些建议——Java知识点归纳(Java基础部分)

  写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,...

Java工程师-10
2017/05/24
768
2
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/23
0
0
【给初学者】Android学习路线

很多朋友都对学习路线问题感到迷茫,特别是还在上学的朋友们。在这里就详细的为大家介绍一下。 1.Java基础 很多朋友一上手就开始学习Android,似乎太着急了一些。Android应用程序开发是以Jav...

Jimmy Xie
2012/09/08
762
1
Java程序设计经典300例

《Java程序设计经典300例》共分为3篇。 第1篇 基础篇(第1~5章)本篇主要内容包括:Java语言基础、流程控制、数组、字符串和面向对象编程。通过本篇的学习,读者可以掌握Java开发环境的配置...

请叫我院长
2013/12/03
495
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
2018/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arduino项目-1. 模拟楼道灯

@toc 1.1 情景说明 说明 漆黑的夜晚,当有人非法进入一所房屋,房屋内的灯在恰当的时间亮起,也许会有效阻止非法活动的继续。 效果展示 1.2 实验器材 器材名称 数量 继电器 1 人体红外感应器...

acktomas
9分钟前
1
0
Nacos 常见问题及解决方法

Nacos 开源至今已有一年,在这一年里,得到了很多用户的支持和反馈。在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方...

阿里云官方博客
16分钟前
2
0
pinyin4j 满足中文转拼音的需求

引入依赖 // https://mvnrepository.com/artifact/com.belerweb/pinyin4j //汉字转拼音compile group: 'com.belerweb', name: 'pinyin4j', version: '2.5.1' 写入中文转拼英的工具......

edison_kwok
21分钟前
2
0
IPSE接入Substrate/Polkadot插槽实现互操作性的运行原理

Substrate框架将区块链的众多功能都模块化,对于开发者来说,只是一个选择的问题,同时还保持了众多的可以定制的功能和模块,比如底层通信模块,比如账户体系,比如共识机制等都是可以自己定...

IPSE
27分钟前
153
0
linux配置安装phpMyAdmin的步骤记录

1、首先在phpMyAdmin官方网站 http://www.phpmyadmin.net/downloads下载源码包,或者通过脚本之家进行下载://www.jb51.net/codes/405261.html ,下载后上传到服务器解压即可,或者通过Linux...

蜗牛女孩
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部