一:异常分类

Throwable:所有错误的祖先。
Error:系统内部错误或者资源耗尽。不用我们管
Exception: 程序有关的异常。重点关注
–RuntimeException: 程序自身的错误
• /,空指针,数组越界…
–非RuntimeException:外界相关的错误
• 打开一个不存在文件
• 加载一个不存在的类...

(一)checked exception(IDE会直接显示出错)

非RuntimeException的Exception的子类: (编译器会辅助检查的)异常,checked exception。
注意: 编译器会检查程序是否为checked exception 配置了处理。如果没有处理,会报错。
Checked Exception(非RuntimeException的Exception的子类),程序员必须处理,以发生后处理为主。编译器会辅助检查

未编译运行:IDE直接指出

必须需要我们处理

(二)Unchecked Exception(IDE不会指出,编译通过,若是运行到此处,才会报错)

Unchecked Exception : (编译器不会辅助检查的,需要程序员自己管的)异常,包括Error子类和RuntimeException子类
Unchecked Exception中的RuntimeException子类,程序必须处理,以预防为主。编译器不关心此类异常,也不会辅助检查。
Error的子类,可以不用处理

IDE不会报错,编译通过

运行报错

总结:

异常是程序发生不正常的行为或出现不正常的状态
Java异常分成Exception(程序相关)和Error(系统相关)
Java程序相关的异常又分成unchecked 异常和checked异常,掌握其不同的处理原则
编译器会辅助检查checked异常

二:异常处理:try-catch-finally

一种保护代码正常运行的机制
try…catch(catch可以有多个,下同)
try…catch…finally
try…finally
try: 正常业务逻辑代码。
catch: 当try发生异常,将执行catch代码。若无异常,绕之。
finally: 当try或catch执行结束后,必须要执行finally
catch块的异常匹配是从上而下进行匹配的。
所以一般是将小的异常写在前面,而一些大(宽泛)的异常则写在末尾

三:异常声明和抛出throws,throw

方法存在可能异常的语句,但不处理,那么可以使用throws来声明异常。
调用带有throws异常(checked exception)的方法,要么处理这些异常,或者再次向外throws,直到main函数为为止
public class ExceptionTest {
//ArithmeticException is a RuntimeException, not checked exception
public int divide(int x, int y) throws ArithmeticException //编译器不会检查,可能会报错,需要我们最好在main函数或者调用函数中进行处理异常
{
int result = x/y;
return x/y;
} public static void main(String[] args) {
ExceptionTest et=new ExceptionTest();
et.divide(1, 0); //不处理会报错
}
}

        try {
et.divide(, ); //进行异常捕获
}catch(ArithmeticException e) {
System.out.println(e.getMessage());
}

四:类方法中异常抛出

一个方法被覆盖,覆盖它的方法必须抛出相同的异常,或者异常的子类。  //可以不被覆盖,不会报错
如果父类的方法抛出多个异常,那么重写的子类方法必须抛出那些异常的子集,也就是不能抛出新的异常。
public class Father {
public void f1() throws ArithmeticException
{ }
}

(一)不允许抛出更大类

(二)不允许抛出新的类

(三)可以抛出相同异常或者子类

(四)可以不抛出异常《重点》

子类也可以选择不进行抛出任何异常,即使他们是父类所定义的异常。

五:自定义异常

Exception类是所有异常的父类。
Exception继承自java.lang.Throwable,同时它有一个兄弟Error。
Error是更严重的问题,一般是系统层面的,无需程序处理。
程序只需要处理Exception

(一)自定义规则《重点》

自定义异常,需要继承Exception类或其子类。
–继承自Exception,就变成Checked Exception
–继承自RuntimeException, 就变成Unchecked Exception
自定义重点在构造函数
–调用父类Exception的message构造函数
–可以自定义自己的成员变量
在程序中采用throw主动抛出异常

(二)自定义异常类

public class MyException extends Exception {

    private String returnCode ;  //异常对应的返回码
private String returnMsg; //异常对应的描述信息 public MyException() {
super();
} public MyException(String returnMsg) {
super(returnMsg);
this.returnMsg = returnMsg;
} public MyException(String returnCode, String returnMsg) {
super();
this.returnCode = returnCode;
this.returnMsg = returnMsg;
} public String getReturnCode() {
return returnCode;
} public String getreturnMsg() {
return returnMsg;
}
}

(二)自定义异常类抛出

public class ExceptionTest {
public static void testException() throws MyException {
throw new MyException("", "The reason of myException"); } public static void main(String[] args) {
ExceptionTest.testException();  //不会通过编译,因为没有处理checked异常

}
}
在方法声明使用throws,在函数中抛出异常使用throw
因为MyException是继承自Exception,checked异常,IDE会进行判断,不会通过,必须处理该异常

        public static void main(String[] args) {

            try {  //编译通过
ExceptionTest.testException();
} catch (MyException e) {
e.printStackTrace();
System.out.println("returnCode:"+e.getReturnCode());
System.out.println("returnMsg:"+e.getreturnMsg());
}
}

(三)对于checked异常,要么方法继续向外throws,要么就进行try...catch处理

1.throws异常

2.进行捕获try...catch,但是注意大范围在后面

六:练习

(一)throws相关

import java.io.*;

class Master{
String doFileStuff() throws FileNotFoundException{
return "a";
}
} class slave extends Master{
public static void main(String[] args){
String s = null;
try{
s = new slave().doFileStuff();
}catch(Exception x){
s = "b";
} System.out.println(s);
} // insert code here }
Which, inserted independently at // insert code here, will compile, and produce the output b? (Choose all that apply.)
A.String doFileStuff() { return "b"; }

B.String doFileStuff() throws IOException { return "b"; }  //新

C.String doFileStuff(int x) throws IOException { return "b"; }  //新,且不是重写

D.String doFileStuff() throws Exception { return "b"; }  //大
不允许抛出更大类,不允许抛出新的类
可以不抛出异常

(二)throw相关

class Plane {
static String s = "-"; public static void main(String[] args){
new Plane().s1();
System.out.println(s);
} void s1() {
try{
s2();
}catch (Exception e){
  s += "c"; 
}
} void s2() throws Exception {
s3(); 
s += "";
s3();
s += "2b";
} void s3() throws Exception{
throw new Exception();
}
}
A.-

B.-c

C.-c2

D.-2c
    void s2() throws Exception {
s3();  //会直接抛出异常,下面的代码不会执行
s += "";
s3();
s += "2b";
}

(三)main参数args默认为null,0个

class MultiCatch
{
public static void main(String args[])
{
try
{
int a=args.length;
int b=/a;
int c[]={};
c[]=; //10行
System.out.println(“b=”+b);
}
catch(ArithmeticException e)
{
System.out.println(“除0异常:”+e); //15行
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println(“数组超越边界异常:”+e); //19行
}
}
}
A.程序将输出第15行的异常信息

B.程序第10行出错

C.程序将输出“b=”

D.程序将输出第19行的异常信息

JAVA核心技术I---JAVA基础知识(异常处理类)的更多相关文章

  1. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  2. Java核心技术 卷1 基础知识-第一天

    基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...

  3. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  4. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  5. java 程序运行的基础知识【Java bytecode】

    聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...

  6. Java Script 学习笔记 -- 基础知识

    Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...

  7. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

  8. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  9. JAVA面试题相关基础知识

        1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...

  10. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

随机推荐

  1. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  2. 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)

    题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...

  3. nowcoder提高集训营第5场

    凉 (比赛链接)[https://www.nowcoder.com/acm/contest/177#question] T1 (题目链接)[https://www.nowcoder.com/acm/c ...

  4. zabbix python 微信告警脚本

    测试zabbix的微信告警耗费了大量时间,使用了开源工具(OneOaaS weixin-alert).shell脚本工具(手动执行正常,服务器调用失败),均没有实现相关功能以下是自己优化过的Pytho ...

  5. 自学华为IoT物联网_06 智慧家庭物联网常见问题及解决方案

    点击返回自学华为IoT物流网 自学华为IoT物联网_06 智慧家庭物联网常见问题及解决方案 1. 家庭中遇到的问题 2.1 华为智慧家庭概念的发展历程 2.2 华为智慧家庭的解决方案架构 智慧家庭主要 ...

  6. 【UOJ#246】套路(动态规划)

    [UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r- ...

  7. Apache虚拟主机+AD压力测试

    <Directory "/usr/local/awstats/wwwroot"> Options NoneAllowOverride None Order allow, ...

  8. redis在centos7下安装

    https://blog.csdn.net/wzygis/article/details/51705559 1.redis下载地址:http://www.redis.cn/download.html ...

  9. [APIO/CTSC 2007]数据备份(贪心+堆)

    你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. ...

  10. CF1106E Lunar New Year and Red Envelopes

    比赛时看到这题懵逼了,比完赛仔细一想是个很简单的dp = = 由于题目限制,可以发现\(B\)取红包的策略是唯一的,可以用优先队列预处理出\(B\)在第\(i\)秒可以拿到的红包的收益\(w_i\)和 ...