关键字:
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. 处理页面载入图片js(等比例压缩图片)

    第一页面html  <div class="admin">${answer.content}</div> <div class="admin ...

  2. 线程相关函数(POSIX线程):

    创建单个线程 #include <pthread.h> // 若成功返回0,出错返回正的Exxx值 int pthread_create(pthread_t *tid, // 每个线程在进 ...

  3. java工具类(四)之实现日期随意跳转

    Java实现日期随意跳转 项目开发过程中.须要进行订单提醒日期的设置.主要包含设置每月指定的日期或者指定的天数,代码例如以下: public static String DateOperation(S ...

  4. DataFactory 5.6注册码

    一.DataFactory 5.6注册码 数据工厂5.6注册码如下,希望能帮助需求之人 AuthKey: 0-87093-23830-05141-17507 SiteMsg: FREELAND EVO ...

  5. java中InputStream String

    Java 中获取输入流时,有时候须要将输入流转成String,以便获取当中的内容 ,以下总结一下 InputStream 转成String 的方式  方法1: public String conver ...

  6. 通过反射获取java nio Direct Memory 的最大值和已使用值

    (ps:jdk1.7及之后可通过MBean获取这两个值)

  7. 深入解析Hibernate核心接口

    Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate核心接口,包括介绍SessionFactory接口.Query和Criteria接口等方面. Session 接口对于Hibe ...

  8. Handler有何作用?怎样使用?

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012974916/article/details/24580405 一  Handler作用和概念 ...

  9. thinkphp 防sql注入

    $Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->selec ...

  10. Uva 3902 Network

    题目大意: 在非叶子节点上安装最少的服务器使得,每个叶子节点到服务器的距离不超过k. 贪心+图上的dfs. 先从深度最大的叶子节点开始找.找到父节点后再用这个父节点进行扩充. /* ********* ...