问:Java异常处理机制,理解了吗?Java异常处理,真的掌握了吗?什么是自定义异常?catch体里遇到return 是怎么处理?finally 体里有return怎么处理?catch 和 finally 体里同时遇上 return 怎么办?几道例题,理清它们。

try catch语句

格式:(代码区如果有错误,就会返回到异常处理)

 try{

 //代码区

 }catch(Exception e){

 //异常处理

 }

首先要清楚,异常有运行时异常和check异常:

运行异常不需要强制捕获,他们是RuntimeException的子类。check异常需要try、catch的异常处理。

可以调用API去查询一下,比如常见的RuntimException有IndexOUtOfBoundsException(索引过界)、NullpointerException(空指针异常)等。常见的check异常有IO异常、SQL异常、FileNotFoundException(日期转换异常)等。

严重的话,如果某个高频率访问的类没有try,出现异常会导致程序崩溃。而try则可以保证程序的正常运行下去,比如说:

 try{
int i = 1/0;
}catch(Exception e){
.....
}

小到一个计算,如果除数为0,则会报错,如果没有try的话,程序直接挂掉。用try的话,则可以让程序运行下去,并且输出为什么出错!

try catch
是捕捉try部分的异常,当你没有try catch的时候,如果出现异常则程序报错,加上try catch,出现异常程序正常运行,只是把错误信息存储到Exception里,所以catch是用来提取异常信息的,你可以在Catch部分加上一句System.out.println(e.ToString());,如果出现异常可以把异常打印出来。

代码实例:

 public class TestEx1 {
public int add(int a, int b) {
return a + b;
} public int dev(int a, int b) {
int c = a / b;// 这里有隐患
return c;
} public static void main(String[] args) {
TestEx1 c = new TestEx1();
int result = c.add(4, 9);
System.out.println("求和的结果是" + result);
try { // 防患于未然
int result_chu = c.dev(90, 0);
System.out.println("除的结果是" + result_chu);
} catch (Exception e) {
System.out.println("出错啦~"); }
}
}

下面补充一下,今天做的几道例题。笔记在注释里面了,要记住。

例一:

 public class TestEx2 {
public int add(int a, int b) {
return a + b;
} public int dev(int a, int b) throws Exception {
int c = a + b;
return c;
} static void main(String[] args) {
TestEx2 c = new TestEx2();
int result = c.add(7, 9);
System.out.println("求和的结果是" + result);
try {
int result_chu = c.dev(90, 0);
System.out.println("除的结果是" + result_chu);
} catch (Exception e) {
e.printStackTrace();
}
}
}

例二:

 public class TestEx3 {
public static void main(String[] args) throws Exception {
throw new Exception("我是扔着玩的");
}
}

例三:

 public class TestEx4 {
public int add(int a, int b) {
return a + b;
} // 假设这个除法的除数和被除数都不能为零
public int dev(int a, int b) throws Exception {
if (a == 0) {
throw new Exception("除数不能为零");
} else if (b == 0) {
throw new Exception("被除数也不能为零");
}
int c = a / b;
return c;
} public static void main(String[] args) {
TestEx4 t = new TestEx4();
int result_add=t.add(4,80);
System.out.println("结果是:" + result_add); try {
//int result_add=t.add(4,80);加法写在try-catch里面,将不能执行
int result = t.dev(0, 90);
System.out.println("结果是:" + result);
//System.out.println("结果是:" + result_add);加法写在try-catch里面,将不能执行
} catch (Exception e) {
e.printStackTrace();
} System.out.println("执行到这里就是完美了");
}
}

例四:

 import java.util.Date;

 //自定义异常:自定义一个类,继承字Eception类,附Eception 继承自Throwable
public class TestEx5 extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
private String m; public TestEx5(String m) {
super();// 调用父类的构造函数,这是一个好的习惯。注意:s是小写的。
this.m = m;
} public void printErrorInfo() {
System.out.println("错误的信息:" + m + "\t" + new Date());
} public void log() {
System.out.println("信息已经写在日志上了");
} // 虚拟一个银行业务
public static class Bank { //要用static修饰一下,否则下面调用的时候,会提示“Bank类没有封闭实例访问类型”
/*
* Java里面static一般用来修饰成员变量或函数。
* 但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。
* 被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。
*
*/
int money = 90000; public void saveMoney(int money) {
this.money += money;
System.out.println("业务办理成功" + "\t" + "存款为" + money + "元");
} /*
* 需求:设置为,每次取钱最多不能超过50000,超了就抛出异常
* 取钱后,余额不能低于2,如果低于2就抛出异常
*/
public void getMoney(int money) throws TestEx5 {
if (money > 50000) {
throw new TestEx5("取款金额最大不能超过50000");
} else if (this.money - money < 2) {
throw new TestEx5("余额不足!");
} else {
this.money -= money;
System.out.println("业务办理成功,本次取款金额为" + money + "元");
System.out.println("当前余额" + this.money + "元");
}
}
} public static void main(String[] args) {
Bank bank = new Bank();
bank.saveMoney(30000);
bank.saveMoney(20000);
try { // 取钱有界限,所以用try-catch把它包裹起来,并制定规约,超出就抛出异常
bank.getMoney(20000);
bank.getMoney(30000);
bank.getMoney(20000);
bank.getMoney(20000);
bank.getMoney(200000);
} catch (TestEx5 e) {// 调用自己定义的超出异常
e.log();
e.printErrorInfo();
e.printStackTrace();
}
}
}

结果:

例五:

 import java.io.FileWriter;
import java.io.Writer; /*
* 请说明一下finally、final、finalize三者的区别:
*1.final:用来定义常量的关键字,修饰方法表示不能重写;修饰类表示不能继承;修饰变量表示值不能改变
*2.finalize:是Object类提供的一个方法,在类被垃圾回收器回收的时候调用,system.gc();可以引起到垃圾回收的调用
*3.finally:用于处理异常,表示代码出不出异常都要执行。(也有两种特殊的情况,会使得finally执行不到)
*/
public class TestEx6 {
public static void main(String[]args){
try{
Writer t=new FileWriter("c:/txt");//快捷键 ctrl+shift+o:直接引入导包
t.write("这是我用eclipse直接在c盘建立的一个文本");//注意这里不是Writer,没有r。
t.close();
/*
*关闭资源,Java本身不具备打开和关闭文件的功能,具备这个功能的往往是操作系统。关闭是个好习惯,如果不进行关闭,操作系统还将继续对他进行占有。
*这时再去试图打开或者删除此文件是不成功的。所用要用到.close();。
*/
}catch(Exception e){
e.printStackTrace();
}
System.out.println("执行到这里就是胜利");
}
}

例六:

 import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer; public class TestEx7 {
/*
* J2SE 提供的最后一个批注是 @SuppressWarnings。
* 该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。
*
* @SuppressWarnings 批注允许您选择性地取消特定代码段(即,类或方法)中的警告。
* 其中的想法是当您看到警告时,您将调查它,如果您确定它不是问题,您就可以添加一个 @SuppressWarnings 批注,以使您不会再看到警告。
* 虽然它听起来似乎会屏蔽潜在的错误,但实际上它将提高代码安全性,因为它将防止您对警告无动于衷 — 您看到的每一个警告都将值得注意。
*/ public static void main(String[] args) {
Writer t = null;//這里定義了一個全局變量
try { t = new FileWriter("c:/1.txt");//上面定義了全局變量t,這里的Writer t=new FileWriter("c:/1.txt");中等號左邊的Writer要去掉。
t.write("这是加入的一个文本");// 注意这里不是Writer,没有r。
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {// finally里面可以有try-catch语句
try {
t.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("會執行到這里嗎?");
}
}

总结:

1.java的异常处理中,在不抛出异常的情况下,程序执行完try里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有finally的代码块,如果没有finally代码块,整个方法在执行完try代码块后返回相应的值来结束整个方法。

2.值得注意的是,如果有finally代码块,此时程序执行到try代码块里的return语句之时并不会立即执行return,而是先去执行 finally 代码块里的代码,此时又分为两种情况,若 finally 代码块里没有return或没有能够终止程序的代码,程序将在执行完finally代码块代码之后再返回try代码块执行return语句来结束整个方法;若finally代码块里有return或含有能够终止程序的代码,方法将在执行完finally之后被结束,不再跳回 try 代码块执行 return。

3.finally里的语句只有两种情况下,会不被执行。一种是,在try-catch语句之前,程序就结束了或者挂掉了。第二种是遇到System.exit();

补充说明System.exit();的用法:

System是一个Java类,调用exit(0)方法终止虚拟机也就是退出你的Java程序,括号里面的是参数,进程结束的返回值。

查看Java.lang.System的源代码,我们可以找到System.exit(status)这个方法的说明,代码如下:

     /**
* Terminates the currently running Java Virtual Machine. The
* argument serves as a status code; by convention, a nonzero status
* code indicates abnormal termination.
* <p>
* This method calls the <code>exit</code> method in class
* <code>Runtime</code>. This method never returns normally.
* <p>
* The call <code>System.exit(n)</code> is effectively equivalent to
* the call:
* <blockquote><pre>
* Runtime.getRuntime().exit(n)
* </pre></blockquote>
*
* @param status exit status.
* @throws SecurityException
* if a security manager exists and its <code>checkExit</code>
* method doesn't allow exit with the specified status.
* @see java.lang.Runtime#exit(int)
*/
public static void exit(int status) {
untime.getRuntime().exit(status);
}

此方法是用来结束当前正在运行中的java虚拟机:

1.System.exit(0)是将整个虚拟机里的内容都停掉了 ;

2.dispose()只是关闭这个窗口,但是并没有停止整个application exit() ;

3.System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序;

4.System.exit(status)不管status为何值都会退出程序。和return 相比有以下不同点:return是回到上一层,而System.exit(status)是回到最上层。

Java基础——详尽说明try-catch-finally的用法的更多相关文章

  1. 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  2. JAVA基础总结【面试】

    前言 近间陆续面试了不少的求职的前(JAVA).后(WEB)端开发人员,包括实习生.应届毕业生.一两年工作经验的.也有三四年工作经验的,也算见过了比较多的开发人员,想在这里做个总结,本次主要讲一讲面试 ...

  3. 夯实Java基础系列10:深入理解Java中的异常体系

    目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...

  4. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  5. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  6. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  7. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  8. Java基础&笔试题

    这些题目是近期我参加过的笔试题和一些我在网上选的部分题,在这里做笔记,认真去学习,更好的应对后面的招聘.有错误欢迎指出. 一.Java基础部分 1.指针在任何情况下都可进行>,<,> ...

  9. Java基础进阶整理

    Java学习笔记整理 本文档是我个人整理的,首先是想通过完成本文档更加扎实自己的基础加强对java语言的理解,然后就是想给入了门的同志们做下贡献. 当然,本文档主要是对java语言基础(当然还有很多基 ...

随机推荐

  1. C#操作数据表中XML格式的数据

    以前还真没有见过数据表中存储XML格式的数据,刚开始听说的时候,还以为是数据表中有XML的字段类型, 再了解,其实也就是字符串类型的,只不过字符串的格式是XML格式的.确实孤陋寡闻!汗... (可添加 ...

  2. .NET Core中使用EF Core连接MySQL

    最近一直在捣鼓.NET Core方面的东西,顺便写下点东西记录下 1.打开vs2017,新建一个项目 2.vs会自动生成一个项目,然后打开NuGet搜索MySql.Data.EntityFramewo ...

  3. cmd下【java监视和管理控制台】

    不需要安装插件,只要jmeter的运行环境配置好就可以了:打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——>运行——> ...

  4. 设计模式《JAVA与模式》之迭代子模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...

  5. mongodb的Snapshot 隔离级别(记住)

    Snapshot 隔离和 Row Version的工作模式 当启用Snapshot隔离级别时,每一个更新数据的操作都会在tempdb中存储该行的原始副本,术语叫作行版本(RowVersion),SQL ...

  6. [0day]微软VS全版本DLL却持漏洞(VS2015 VS2013 VS2012 VS2010 VS2008)

    <无敌破坏王>大师兄说的 "我不是针对谁,而是在座的各位,都是垃圾"前几天在国外论坛看到一个VS2010 DLL却持漏洞 测试发现是全版本 实际上2014年在某越南黑客 ...

  7. NVIDIA GRID 和 NICE DCV 技术用于实现 Linux 和 Windows® 图形加速虚拟桌面

    NVIDIA GRID 和 NICE DCV 技术用于实现 Linux 和 Windows® 图形加速虚拟桌面. NICE DCV: 满足 LINUX 和 WINDOWS 的远程 3D 通过 NICE ...

  8. 03-01 Java运算符

    (1)算术运算符 A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正号 c:字符串连接符 C:/和%的区别 数据做除法操作的时候,/取得是商,%取得是余数 D:++和--的用法 a:他 ...

  9. npm安装第三方库找不到“cl.exe”问题

    1.安装第三方库时找不到"cl.exe"的解决方法 安装 本地 remix时 出现错误(npm install remix-ide -g) 原因:remix 依赖的 python库 ...

  10. (转) CentOS7.4 + MySQL8.0 + Git + Gogs搭建

    原文:https://blog.csdn.net/qq_16075483/article/details/80295793 1.装系统,这个不会的下面就不用看了2.CentOS7.X安装MySQL8. ...