Java中异常处理之try和catch代码块的使用
转自:https://www.jb51.net/article/72901.htm
Java try和catch的使用
尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常。这样做有两个好处。第一,它允许你修正错误。第二,它防止程序自动终止。大多数用户对于在程序终止运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说)。幸运的是,这很容易避免。
为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句。完成这个任务很简单,下面的程序包含一个处理因为被零除而产生的ArithmeticException 异常的try块和一个catch子句。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Exc2 {
public static void main(String args[]) {
int d, a;
try { // monitor a block of code.
d = 0 ;
a = 42 / d;
System.out.println( "This will not be printed." );
} catch (ArithmeticException e) { // catch divide-by-zero error
System.out.println( "Division by zero." );
}
System.out.println( "After catch statement." );
}
}
|
该程序输出如下:
1
2
|
Division by zero.
After catch statement.
|
注意在try块中的对println( )的调用是永远不会执行的。一旦异常被引发,程序控制由try块转到catch块。执行永远不会从catch块“返回”到try块。因此,“This will not be printed。”
将不会被显示。一旦执行了catch语句,程序控制从整个try/catch机制的下面一行继续。
一个try和它的catch语句形成了一个单元。catch子句的范围限制于try语句前面所定义的语句。一个catch语句不能捕获另一个try声明所引发的异常(除非是嵌套的try语句情况)。
被try保护的语句声明必须在一个大括号之内(也就是说,它们必须在一个块中)。你不能单独使用try。
构造catch子句的目的是解决异常情况并且像错误没有发生一样继续运行。例如,下面的程序中,每一个for循环的反复得到两个随机整数。这两个整数分别被对方除,结果用来除12345。最后的结果存在a中。如果一个除法操作导致被零除错误,它将被捕获,a的值设为零,程序继续运行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// Handle an exception and move on.
import java.util.Random;
class HandleError {
public static void main(String args[]) {
int a= 0 , b= 0 , c= 0 ;
Random r = new Random();
for ( int i= 0 ; i< 32000 ; i++) {
try {
b = r.nextInt();
c = r.nextInt();
a = 12345 / (b/c);
} catch (ArithmeticException e) {
System.out.println( "Division by zero." );
a = 0 ; // set a to zero and continue
}
System.out.println( "a: " + a);
}
}
}
|
显示一个异常的描述
Throwable重载toString( )方法(由Object定义),所以它返回一个包含异常描述的字符串。你可以通过在println( )中传给异常一个参数来显示该异常的描述。例如,前面程序的catch块可以被重写成
1
2
3
4
|
catch (ArithmeticException e) {
System.out.println( "Exception: " + e);
a = 0 ; // set a to zero and continue
}
|
当这个版本代替原程序中的版本,程序在标准javaJDK解释器下运行,每一个被零除错误显示下面的消息:
1
|
Exception: java.lang.ArithmeticException: / by zero
|
尽管在上下文中没有特殊的值,显示一个异常描述的能力在其他情况下是很有价值的——特别是当你对异常进行实验和调试时。
Java 多重catch语句的使用
某些情况,由单个代码段可能引起多个异常。处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常。当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行。当一个catch语句执行以后,其他的子句被旁路,执行从try/catch块以后的代码开始继续。下面的例子设计了两种不同的异常类型:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// Demonstrate multiple catch statements.
class MultiCatch {
public static void main(String args[]) {
try {
int a = args.length;
System.out.println( "a = " + a);
int b = 42 / a;
int c[] = { 1 };
c[ 42 ] = 99 ;
} catch (ArithmeticException e) {
System.out.println( "Divide by 0: " + e);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println( "Array index oob: " + e);
}
System.out.println( "After try/catch blocks." );
}
}
|
该程序在没有命令行参数的起始条件下运行导致被零除异常,因为a为0。如果你提供一个命令行参数,它将幸免于难,把a设成大于零的数值。但是它将导致ArrayIndexOutOf BoundsException异常,因为整型数组c的长度为1,而程序试图给c[42]赋值。
下面是运行在两种不同情况下程序的输出:
1
2
3
4
5
6
|
C:\>java MultiCatch
a = 0
Divide by 0: java.lang.ArithmeticException: / by zero After try/catch blocks.
C:\>java MultiCatch TestArg
a = 1
Array index oob: java.lang.ArrayIndexOutOfBoundsException After try/catch blocks.
|
当你用多catch语句时,记住异常子类必须在它们任何父类之前使用是很重要的。这是因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,如果子类在父类后面,子类将永远不会到达。而且,Java中不能到达的代码是一个错误。例如,考虑下面的程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/* This program contains an error.
A subclass must come before its superclass in a series of catch statements. If not,unreachable code will be created and acompile-time error will result.
*/
class SuperSubCatch {
public static void main(String args[]) {
try {
int a = 0;
int b = 42 / a;
} catch(Exception e) {
System.out.println("Generic Exception catch.");
}
/* This catch is never reached because
ArithmeticException is a subclass of Exception. */
catch (ArithmeticException e) { // ERROR - unreachable
System.out.println( "This is never reached." );
}
}
}
|
如果你试着编译该程序,你会收到一个错误消息,该错误消息说明第二个catch语句不会到达,因为该异常已经被捕获。因为ArithmeticException 是Exception的子类,第一个catch语句将处理所有的面向Exception的错误,包括ArithmeticException。这意味着第二个catch语句永远不会执行。为修改程序,颠倒两个catch语句的次序。
转载于:https://www.cnblogs.com/sharpest/p/7807019.html
Java中异常处理之try和catch代码块的使用相关推荐
- java 中的静态(static)代码块
类字面常量 final 静态域不会触发类的初始化操作 非 final static 静态域(以及构造器其实是一种隐式的静态方法) Class.forName():会自动的初始化: 使用 .class来 ...
- java中你知道这四种代码块吗?
大家好,我是雄雄,今天给大家分享的是:java中构造代码块的用法. 什么叫代码块?代码块将多行代码封装到一个{}中,形成一个独立的代码区,这就够成了代码块,一般常见的代码块是这样的: Java中,代码 ...
- java 中的静态变量,静态代码块,动态代码块,构造方法执行顺序的深入探究
要想完全弄懂这个执行顺序,需要我们先了解几个概念. 首先是类加载与对象的构造,类加载就是在第一次调用这个类的时候jvm虚拟机会通过类加载器在一个叫做方法区的逻辑内存中将所要用到的类的信息存放在里边,其 ...
- java中异常处理语句错误用法的是_Java异常处理语句及解析
Java异常处理语句及解析 一.选择题 1.java中用来抛出异常的关键字是 (C) A.tryB.catchC.throw D.finally 2.关于异常,下列说法正确的是 (A) A.异常是一种 ...
- java中异常处理try块的说法正确的是_下面关于Java中异常处理try块的说法正确的是( )?...
下面关于Java中异常处理try块的说法正确的是( )? 答:可能抛出异常的方法调用应放在try块中. try块后通常应有一个catch 块,用来处理try块中抛出的异常. 滴定起点pH值提高,滴定突 ...
- 代码块:在Java中,使用{}括起来的代码被称为代码块。
/*代码块:在Java中,使用{}括起来的代码被称为代码块.根据其位置和声明的不同,可以分为局部代码块:局部位置,用于限定变量的生命周期.构造代码块:在类中的成员位置,用{}括起来的代码.每次调用构造 ...
- 第三次学JAVA再学不好就吃翔(part29)--代码块
学习笔记,仅供参考 面向对象 代码块 代码块概述 在Java中,使用{}括起来的代码被称为代码块. 代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程) ...
- JAVA入门级教学之(static静态代码块)
定义一个测试类测试static静态代码块: package com.lbj.javase08; /*** 可以使用static关键字来定义"静态代码块"* * 1.语法格式:* s ...
- Java入门day08(帮助文档、代码块、继承)
1.如何制作帮助文档 个人理解:写一个功能类,然后对其解释说明 注意该功能类必须用public修饰,否则会报错 如class ArrayTools javadoc: 错误 - 找不到可以文档化 ...
最新文章
- [android] 练习使用ListView(一)
- Keycloak Spring Security适配器的常用配置
- python写的游戏怎么给别人玩-一步步教你怎么用python写贪吃蛇游戏
- 科技创业公司的效率工具箱
- php trim用法,php trim函数怎么用?
- DiskFileUpload类常用方法
- iis php5.2 cgi,在PHP 5.2.6 / IIS CGI中清空$_POST数组
- arm 服务器优势,零的突破 戴尔正式宣布基于ARM架构服务器
- Unity 5.x---00使用重力
- 10 个优秀的JavaScript开发框架
- [CERC2017]Intrinsic Interval(神仙+线段树)
- 微管理——给你一个技术团队,你该怎么管
- 如何编辑修改PDF文件的内容?
- 吴忌寒何以成“眼中钉”?
- 基于Azure Percept 避障乐高汽车
- 【FPGA创新设计竞赛——2022紫光同创杯】1、“基于 RISC-V 处理器的软硬件系统设计”赛题介绍
- (1)js数组常用方法 splice()、slice()、push()、unshift()、pop()、shift()、join()、reverse()、sort()、concat()、split()
- css属性:hover
- linux rz位置,Linux下rz命令使用的实例详解
- 制作一个“生日快乐”App,来自程序员的生日礼物~
热门文章
- Bootstrap 基本模板
- 大数据分布式集群搭建(9)
- 人群密度估计--Fully Convolutional Crowd Counting On Highly Congested Scenes
- 对抗网络用于人脸转正--Beyond Face Rotation
- GO语言教程4:defer(延迟语句)详解
- Java常见面试题(持续更新)
- ecshop安装linux7,RedHat下如何搭建ecshop?
- android xml转换成svg,如何将Android xml布局转换为png / svg以在iOS版本中使用
- MySQL存储过程详解
- 开发工具之Eclipse快捷键