? 理解异常和异常处理
区别异常的类型,Error与 Exception,必检异常与免检异常
在方法头中声明异常
在方法中抛出异常
用 try-catch块处理异常
了解异常的传播
在 try-catch块中重新抛出异常
在 try-catch块中使用 finally子句
了解何时使用 异常
声明自定义异常类第 6章 异常处理程序错误:语法错误、运行错误、逻辑错误
语法错误是指代码没有遵循语言的规则,可以由编译器检查发现。
在程序运行过程中,如果环境发现一个不可能执行的操作,就会出现运行错误。
如果程序没有按照预期的方案执行,就会发生逻辑错误。
Runtime Errors
import javax.swing.JOptionPane;
public class Test {
public static void main(String[] args) {
String input = JOptionPane.showInputDialog(null,
"Please enter an integer");
int number = Integer.parseInt(input);
// Display the result
JOptionPane.showMessageDialog(null,
"The number entered is " + number);
System.exit(0);
}
}
如果这行出现异常,就会跳过该方法 中其余的行,程序终止程序结束程序 readFile(自然语言描述 )
readFile{
open the file;
determine its size;
allocate the much memory;
read the file into memory;
close the file;
}
传统错误处理:通过函数返回值
readFile{
initialize errorCode=0;
open the file;
if(theFilesOpen){
determine its size;
if(getTheFileLenght){
allocate the much memory;
if(getEnoughMemory){read the file into memory;
if(readFailed){
errorCode=-1;
}
}else {
errorCode=-2;
}
}else {
errorCode=-3;
}
close the file;
if(theFildDidntClose && errorCode==0){errorCode=-4;
}else {
errorCode=-5;
}
} else {
errorCode=-6;
}
return errorCode;
}
异常处理机制
readFile{
try{
open the file;
determine its size;
allocate the much memory;
read the file into memory;
close the file;
} catch(fileOpenFailed){
handle;
} catch(sizedeterminationFailed){
handle;
} catch(memoryAllocationFailed){
handle;
} catch(readFailed){
handle;
} catch(fileCloseFailed){
handle;
}
}
Catch Runtime Errors
import javax.swing.JOptionPane;
public class Test {
public static void main(String[] args) {
try {
String input = JOptionPane.showInputDialog(null,
"Please enter an integer");
int number = Integer.parseInt(input);
// Display the result
JOptionPane.showMessageDialog(null,
"The number entered is " + number);
}
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Incorrect input,an integer is required");
}
System.out.println("Execution continues,..");
System.exit(0);
}
}
如果这行出现异常,就会跳过 try子句中其余的行,并把程序控制转移到 catch子句捕获并处理这个异常后,程序控制转移到
Try-catch块之后的第一条语句
Exception Classes
L i n k ag e Er r o r
Er r o r
A WT Er r o r
A WT Ex ce p t i o n
T h r o w ab l e
C l assN o t F o u n d Ex ce p t i o n
V i r t u al M a ch i n e Er r o r
I O Ex c e p t i o n
Ex ce p t i o n
R u n t i me Ex ce p t i o n
O b j e ct
A r i t h me t i cE x ce p t i o n
N u l l Po i n t e r Ex ce p t i o n
I n d e x O u t O f B o u n d sEx ce p t i o n
Se v e r al mo r e cl ass es
Se v e r al mo r e cl asse s
Se v e r al mo r e cl asse s
I l l e g al A r g u me n t Ex ce p t i o n
System Errors
L i n k ag e Er r o r
Er r o r
A WT Er r o r
A WT Ex ce p t i o n
T h r o w ab l e
C l assN o t F o u n d Ex ce p t i o n
V i r t u al M a ch i n e Er r o r
I O Ex c e p t i o n
Ex ce p t i o n
R u n t i me Ex ce p t i o n
O b j e ct
A r i t h me t i cE x ce p t i o n
N u l l Po i n t e r Ex ce p t i o n
I n d e x O u t O f B o u n d sEx ce p t i o n
Se v e r al mo r e cl ass es
Se v e r al mo r e cl asse s
Se v e r al mo r e cl asse s
I l l e g al A r g u me n t Ex ce p t i o n
System errors 是由 Java虚拟机抛出并在 Error类中描述的。 Error类描述内部的系统错误。这种错误很少发生,一旦发生,除了通知用户以及尽量稳妥地结束程序外,几乎什么也不能做
Exceptions
L i n k ag e Er r o r
Er r o r
A WT Er r o r
A WT Ex ce p t i o n
T h r o w ab l e
C l assN o t F o u n d Ex ce p t i o n
V i r t u al M a ch i n e Er r o r
I O Ex c e p t i o n
Ex ce p t i o n
R u n t i me Ex ce p t i o n
O b j e ct
A r i t h me t i cE x ce p t i o n
N u l l Po i n t e r Ex ce p t i o n
I n d e x O u t O f B o u n d sEx ce p t i o n
Se v e r al mo r e cl ass es
Se v e r al mo r e cl asse s
Se v e r al mo r e cl asse s
I l l e g al A r g u me n t Ex ce p t i o n
Exceptions类描述由程序和外部环境引起的错误
,这些错误能通过程序捕获和处理。
Runtime Exceptions
L i n k ag e Er r o r
Er r o r
A WT Er r o r
A WT Ex ce p t i o n
T h r o w ab l e
C l assN o t F o u n d Ex ce p t i o n
V i r t u al M a ch i n e Er r o r
I O Ex c e p t i o n
Ex ce p t i o n
R u n t i me Ex ce p t i o n
O b j e ct
A r i t h me t i cE x ce p t i o n
N u l l Po i n t e r Ex ce p t i o n
I n d e x O u t O f B o u n d sEx ce p t i o n
Se v e r al mo r e cl ass es
Se v e r al mo r e cl asse s
Se v e r al mo r e cl asse s
I l l e g al A r g u me n t Ex ce p t i o n
RuntimeExceptions 类描述编程错误,比如不合适的转换、访问一个越界数组或数值错误等。该类异常通常由 Java虚拟机抛出。
必检异常和免检异常
RuntimeException,Error 以及它们的子类都称为免检异常。除此之外的所有异常都称为必检异常,意思是指编译器会强制程序员检查并处理它们
免检异常通常反映程序设计中不可重获的逻辑错误,如引用空对象变量,会抛出 NullPointerException异常,这都是程序中必须纠正的逻辑错误。
免检错误可能在程序任何地方出现,为避免过多地使用 try-
catch块,Java语言不允许编写捕获或声明免检异常的代码。
必检异常和免检异常
L i n k ag e Er r o r
Er r o r
A WT Er r o r
A WT Ex ce p t i o n
T h r o w ab l e
C l assN o t F o u n d Ex ce p t i o n
V i r t u al M a ch i n e Er r o r
I O Ex c e p t i o n
Ex ce p t i o n
R u n t i me Ex ce p t i o n
O b j e ct
A r i t h me t i cE x ce p t i o n
N u l l Po i n t e r Ex ce p t i o n
I n d e x O u t O f B o u n d sEx ce p t i o n
Se v e r al mo r e cl ass es
Se v e r al mo r e cl asse s
Se v e r al mo r e cl asse s
I l l e g al A r g u me n t Ex ce p t i o n
Unchecked Exceptions
异常处理:声明异常、抛出异常、捕获异常
method1() {
try {
invoke method2;
}
catch (Exception ex) {
Process exception;
}
}
method2() throws Exception {
if (an error occurs) {
throw new Exception();
}
}
捕获异常 抛出异常声明异常声明异常每个方法必须说明它可能抛出的必检异常的类型,
这称为声明异常。
public void myMethod() throws IOException
public void myMethod() throws IOException,
OtherException
抛出异常程序检查到一个错误后,创建一个适当类型异常的实例并抛出它,称为抛出异常。
throw new TheException();
TheException ex = new TheException();
throw ex;
抛出异常例子
/** Set a new radius */
public void setRadius(double newRadius)
throws IllegalArgumentException {
if (newRadius >= 0)
radius = newRadius;
else
throw new IllegalArgumentException(
"Radius cannot be negative");
}
捕获异常
try {
statements; // Statements that may throw exceptions
}
catch (Exception1 exVar1) {
handler for exception1;
}
catch (Exception2 exVar2) {
handler for exception2;
}
...
catch (ExceptionN exVar3) {
handler for exceptionN;
}
捕获异常
main method {
...
try {
...
invoke method1;
statement1;
}
catch (Exception1 ex1) {
Process ex1;
}
statement2;
}
method1 {
...
try {
...
invoke method2;
statement3;
}
catch (Exception2 ex2) {
Process ex2;
}
statement4;
}
method2 {
...
try {
...
invoke method3;
statement5;
}
catch (Exception3 ex3) {
Process ex3;
}
statement6;
}
An exception
is thrown in
method3
捕获或声明异常
Java强迫程序员处理必检异常,如果方法声明了一个必检异常,必须在
try-catch块中调用它或者在调用它的方法中声明抛出异常。 比如,假设方法 p1 调用方法 p2,p2 可能会抛出必检异常 (e.g.,IOException),
则要写成下列 (A) or (B)的写法,
void p1() {
try {
p2();
}
catch (IOException ex) {
,.,
}
}
(A)
(B)
void p1() throws IOException {
p2();
}
例子附 1 声明、抛出和捕获异常
本例子演示如何声明、抛出和捕获异常
TestCircleWithException CircleWithException
重新抛出异常当一个方法出现异常时,如果没有捕获异常,该方法就会立即退出。
如果方法在退出之前需要执行某些任务,应该在该方法中捕获异常,然后按如下的结构将异常重新抛出,交给调用它的方法:
try {
statements;
}
catch(TheException ex) {
perform operations before exits;
throw ex;
}
finally 子句有时,不论异常是否出现或者是否被捕获,都希望执行某些代码 。 Finally子句可以达到这一目的 。
其结构如下:
try {
statements;
}
catch(TheException e) {
handling e;
}
finally {
finalStatements;
}
在任何情况下,finally块中的代码都会执行,不管 try块中是否出现异常或者是否捕获了异常何时使用异常?
异常处理可以将错误处理代码从正常的编程任务中分离出来,这样可以使程序容易阅读和修改。
但由于异常处理需要初始化新的异常对象并通过方法调用链传播以搜寻异常处理器,这样会需要更多的时间和资源。
项目中多个类发生共同异常,应该考虑当作异常类处理,即必须处理不可预料的错误时应该使用异常类,不要用异常类处理发生在个别方法中的简单的、可预料的错误。
if (refVar != null)
System.out.println(refVar.toString());
else
System.out.println("refVar is null");
try {
System.out.println(refVar.toString());
}
catch (NullPointerException ex) {
System.out.println("refVar is null");
}
最好用以下代码代替创建自己的异常类
Java提供了相当多的异常类,尽量使用它们而不要创建自己的异常类。然而,如果遇到了预定义异常类不能恰当描述的问题,可以通过扩展 Exception类或其子类来创建自己的异常类。
示例:
public class myException extends Exception
{
public myException(){
super(“不能被 0除,);
}
public myException(String str){
super(str);
}
}
程序将创建自己的被 0除的异常类:
下面是主类 Example,要求从键盘输入被除数和除数,并输出运算结果。
public class Example6_3
{ public static void main(String[] args){
Scanner reader = new Scanner(System.in);
double num = 0;
double deno = 0;
try{ System.out.println(“请输入被除数:,);
num = reader.nextDouble();
System.out.println(“请输入除数:,);
deno = reader.nextDouble();
if(deno = = 0.0)
throw new myException();
System.out.println(“商是:,+(num/deno));
}
catch(myException e){ System.out.println(“出现异常:,+e.toString());
}
catch(Exception e){
System.out.println(“出现异常:,+e.toString());
}}}