关键字:
try:执行可能产生异常的代码
catch:捕获异常
finally:无论是否发生异常代码总能执行
throws:声明方法可能要抛出的各种异常
throw:手动抛出自定义异常
用 try-catch-finally 异常处理:
情况一(正常运行,无异常):
执行try,执行finally,执行finally块后的语句
情况二(try中出现异常)
执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句
public class Test2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入被除数:");
try { // 将开始可能异常的代码放入try
int num1 = in.nextInt();
System.out.println("接受除数");
int num2 = in.nextInt();
System.out.println(num1+"/"+num2+"="+num1/num2);
//return;
//异常块:catch和finally必须至少出现一个,try块必须有
}catch (InputMismatchException e){//try中有匹配的异常,异常后的语句均不执行,直接调用catch,然后执行catch块之后的程序,若有异常但不匹配,不执行catch块,程序直接结束
System.out.println("出现错误,被除数和除数必须为整数");
//e.printStackTrace();//输出异常堆栈信息,打印错误序列,调用过程
e.getMessage();
//System.exit(1);
return;
}catch (ArithmeticException e){
System.out.println("被除数不可为0");
e.printStackTrace();
}finally {//无论是否发生异常,异常是否匹配,都会执行finally,若catch调用System.exit(1);finally与finally之后语句均不执行
System.out.println("感谢使用");
}
System.out.println("finally之后语句");
特殊情况之try中含有return:
a.无异常(执行顺序):
1.return之前的代码 2.finally 3.return语句 4.执行完成(不会执行return之后语句,也不会执行finally块之后的语句)
b.有异常(执行顺序):
1.异常之前与异常代码 2.catch语句 3.finally块 4.finally块之后语句 5.执行完毕(因为异常直接跳到catch块,所以try中return不会执行)
 
特殊情况之catch中含有return
a.无异常(执行顺序):
1.执行try代码块 2.执行finally块 3.执行finally之后的语句 4.退出(无异常,所以不执行catch,直接执行finally)
b.有异常(执行顺序):
这里有两种情况
情况一(异常匹配到的代码块中有return):
1.执行try块(异常语句后的try语句均不执行)2.执行catch块return之前的语句 3.执行finally块 4.执行catch中的return语句 5.退出
情况二(异常匹配到的代码块无有return,catch在其他chtch块中)
执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句
catch块的执行原理:
对于异常的捕获,可以有多个catch,对于try发生的异常,他会根据发生的异常和catch里面的异常类型进行匹配(按照catch块从上往下匹配,但并不会执行不匹配的catch块语句),当他匹配到某个catch块时,他就直接进入这个catch块内,忽略这个catch块后面的所有catch块,所以,一般将catch(Exception e)放在最后,catch块承先子类后父类排列。
 
注意:无论是否发生异常,异常是否匹配,均会执行finally块,阻止finally执行的唯一方法是在catch块中调用 System.exit(1) 语句(System.exit(1)表示非正常退出程序)。
 
 
用 throw 进行异常处理:
开发方法遇到异常时,开发人员不一定要一定去处理这个异常,可以用throws向上继续抛出这个异常(异常可以抛出多个,每个用逗号隔开),强制调用者处理这个异常,调用者可以用try-catch处理,也可以继续向上声明,若在main方法处继续向上声明,就会让jvm去处理这个异常。
自定义异常:
第一步:若需要自定义异常名字,需新建一个类MyException,并让它继承Exception;重写构造方法,
若不需要自定义异常名字,则可以略过第一步,在第二步直接书写 throw new Exception("");
public class MyEcxeption extends Exception {
public MyEcxeption(String message) {
super(message);
}
}
第二步:在你需要的类中引用他(需要用关键字throw),注意,在引用类必须抛出这个异常
public void setSex(String sex) throws MyException{
if (sex.equals("男") || sex.equals("女") ){
this.sex = sex;
}else {
throw new MyException("性别必须为男或女");
} }
throw与throws的区别:
throw自行定义并抛出异常,位于方法体内部,只可以跟一个异常对象
throws抛出异常,位于方法参数列表后,可以跟多个异常类
 

java实训 :异常(try-catch执行顺序与自定义异常)的更多相关文章

  1. Java实训:实训一 ——长春职业技术学院 16级网络工程

    Java实训:实训一 本文会解释一些设计思路. 想看具体过程,请转:https://www.cnblogs.com/lxwlxw/p/10114187.html 笑维的码云项目命名不太对,所以我来:h ...

  2. 2018 java实训总结(时间戳&&主键)

    java实训题目:源管理系统. 答辩的时候被老师怼了以下几个的地方: 1.主键改变了 2.没时间戳却说自己的程序里有先后(这就是老师迂腐了,主键自增可以间接反馈出他加入的早晚,即使主键做出了改变但只是 ...

  3. java中子类继承父类程序执行顺序

    java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...

  4. Java学习笔记__异常机制_try_catch_finally_return执行顺序

    package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  5. java中return与finally的执行顺序

    可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...

  6. 理清Java中try-catch-finally带return的执行顺序

    前言:try-catch-finally带return和异常时,它们之间执行顺序问题是留下来的一个小疑问,今天搞清楚它们 第一种情况:无异常 //1.try-catch-finally都带有retur ...

  7. java类的初始化块/执行顺序,实例化对象数据赋值

    java里初始化一个类的对象,通过初始化快或者构造方法进行数据赋值.与其相关的执行代码有这么几种: 静态初始化块 初始化块 构造方法 静态初始化块 静态初始化块只在类加载时执行一次,同时静态初始化块只 ...

  8. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  9. 【转】java静态代码块和构造方法执行顺序

    先看看下面几个类,然后判断它们的输出public class A { static{System.out.print(1);}public A(){System.out.print(2);}} pub ...

随机推荐

  1. C++中的链式操作

    代码编译环境:Windows7 32bits+VS2012. 1.什么是链式操作 链式操作是利用运算符进行的连续运算(操作).它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作. ...

  2. Distributed Management Task Force----分布式管理任务组

    http://baike.baidu.com/link?url=Y9HGLs8Qj6pXbbgY6xPdfiGDsQO8Eu1e80B4giQtQ_hAfGNF59byxnLoERYri4Duw7Gw ...

  3. Python - scrapy安装中libxml2问题

    先到 http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下载下面三个库的 whl,然后用pip install 来安装即可 pycurl,lxml,lib ...

  4. 使用脚本删除ios工程中未使用图片

    使用脚本删除ios工程中未使用图片 最近在读唐巧大神的<iOS开发进阶>,学到了一个大招:使用脚本删除ios中未使用的图片(纸书上有点小问题,参考github上的issue:使用脚本删除i ...

  5. mt7620 wifi driver

    <*> Ralink RT2860 802.11n AP support [*] LED Support [*] WSC (WiFi Simple Config) [*] WSC 2.0( ...

  6. angularjs开发常见问题-2(angularjs内置过滤器)

    在angular中内置了几个经常使用的filter,能够简化我们的操作. 过滤器使用 '|' 符号,概念有点相似于linux中的管道. 1.filter (过滤) filter能够依据条件过滤数据.样 ...

  7. HashMap随机取值和迭代器取值的对比

    一共四中方法,前两种是迭代器取值,后两种是随机取值,循环了5000万次,时间分别为:迭代器读取的速度大约是随机读取的速度的1.5倍,数据量越大,差距越明显. 另外,插入是读取的100倍左右的时间(这个 ...

  8. A Practical Introduction to Blockchain with Python

    A Practical Introduction to Blockchain with Python // Adil Moujahid // Data Analytics and more http: ...

  9. SDIO卡 了解

    SDIO接口是在SD接口基础上发展起来的,SDIO接口兼容SD接口.SDIO协议又在SD卡协议之上添加了CMD52(一般用来访问寄存器)和CMD53(字节和块传输)命令.SDIO和SD卡规范间的一个重 ...

  10. bfs 邻接表

    #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int date; st ...