没有人敢保证说它写的程序永远没有错。即使写的程序没有错,也不要指望你的用户能按照你的意愿来执行程序,比如,你不要指望用户的网络是畅通的,你不要指望你需要的某个文件一定会在它应该存在的位置,你不要期待用户一定会在需要数字的地方输入数字而不是字母甚至更奇怪的符号。
作为程序设计人员,你应该尽可能多的去想象可能会碰到的错误、尽可能糟糕地去考虑用户不规范的输入、尽可能的取考虑运行环境的恶劣,所谓“有备无患”,不要等到出了问题再去补救。
但是,且慢,我们需要针对每一个错误都自己去编写错误处理程序么?在一些编程语言中,答案也许是的,或许也没有这么糟糕,而对于Java,答案是“否”,基本上,Java将这些都替你考虑到了。
在Java中,有两个类用于处理两种方式用于处理错误:Error和Exception。
Error处理的是Java运行环境中的内部错误或者硬件问题,比如,内存资源不足等。对于这种类型错误,程序基本上是无能为力的,除了退出运行外别无它法。
而对于Exception,它处理的是因为程序设计的瑕疵而引起的问题或者外在的输入等引起的一般性问题,例如:在开平方的方法中输入了一个负数,对一个为空的对象进行操作以及网络不稳定引起的读取网络问题等,都可以通过Exception来处理。
在Java中,异常对象分为两大类:Error和Exception。
Error类和Exception类都是Throwable类的子类。Error类只有四个子类:AWTError、LinkageError、VirtualMachineError以及ThreadDeath,正如前面所述,它处理的是Java运行系统中的内部错误以及资源耗尽等情况,这种情况是程序员所无法掌握的,我们只有通知用户并安全退出程序的运行。
而Exception的子类就很多了,可以大致将它的子类分为三类:有关I/O的IOException,有关运行时的异常RuntimeException以及其他的异常。RuntimeExcepiton异常是由于程序编写过程中的不周全的代码引起的,而IOException是由于IO系统出现阻塞等原因引起的。
我们来看一个异常的例子。
源文件:ExceptionExam.java
public class ExceptionExam {
public static void main(String args[]) {
int a, b;
double c;
a = Integer.parseInt(args[0]);
b = Integer.parseInt(args[1]);
c = a / b;
System.out.println(a + "/" + b + " = " + c);
}
}
在这个程序中,我们从控制台接收两个参数,并对它们进行一个除法运算,你或许会期望用户总是能输入两个正确的操作数,但是,现实总不是你想象中的那么美好:也许,用户会输入一个0来作为除数,这个时候,情况就不如你想象的那样了,我们来
想象一下用户输入如下的命令来执行这个程序:
java ExceptionExam 12 0
这个时候,我们就会从控制台得到一个异常信息,如下:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionExam.main(ExceptionExam.java:10)
在这个例子中,可能会因为用户输入的数据而引起数学计算的错误,它是一个RuntimeException(ArithmeticException是RuntimeException的子类)。
我们再来看一个例子。
public class ExceptionExam1 {
public static void main(String args[]) {
java.util.Date d = null;
System.out.println(d.getTime());
}
}
这个程序很简单,就是试图从一个Date对象中得到时间。运行这个程序,将会在控制台上得到如下的信息:
Exception in thread "main" java.lang.NullPointerException
at ExceptionExam1.main(ExceptionExam1.java:6)
在这个程序中,我们没有给引用变量一个真正的Date对象,因此,当试图通过这个变量调用Date对象中的方法时,将会出现一个“空指针引用”的异常。它也是一个RuntimeException(NullPointerException也是RuntimeException的子类)。
当然,上面这两个程序是很容易避免这种错误的,我们完全可以在调用它的方法之前判断,如判断除数参数是否为0,若为0,就不进行除法运算;或者首先判断对象是否为null,再决定是否调用这个对象的方法。
这种异常通常都是运行时异常,它们都有一个共同的父类RuntimeException。虽然我们可以通过程序的控制来将这种异常扼杀在程序设计阶段,但在一些更复杂的应用中,我们常常无法避免类似这种情况的出现。这个时候就可能需要使用Java的异常处理机制来对这些情况进行处理了。
还有一些异常,我们无法通过程序的控制来避免它的出现,比如,我们不太可能将客户可能输入的url地址作一个准确的判断,以决定是否进行网络连接等,这个时候,我们就必须使用Java的异常处理机制来进行处理。如果没有使用Java的异常处理机制,在编译程序的时候,编译器会强制让你必须进行处理。
例如,我们来看下面这个程序。
import java.io.*;
public class ExceptionExam2 {
public static void main(String[] args) {
FileInputStream fis = new FileInputStream("c:/a.txt");
// 其他处理代码
}
}
在这个程序中,用到了流的概念。在这里先简单将相关的FileInptStream这个类简单介绍一下。FileInputStream类通常用于从指定的文件中读取数据,它的方法read()的功能是每次从相应的(本地为ASCII码编码格式)文件中读取一个字节,并转换成0~255之间的int型整数返回,到达文件末尾时则返回-1。
这个程序试图建立一个到指定文件的输入流,但是,我们无法总是保证文件存在或者文件是可读的,因此,在这个地方应该对文件是否存在的异常进行处理,如果没有进行处理,就象上面这段代码,那么,在编译的时候,编译器将会报告一个错误:
ExceptionExam2.java:7: unreported exception java.io.FileNotFoundException; must
be caught or declared to be thrown
FileInputStream fis = new FileInputStream("c:/a.txt");
^
1 error
因此,对于一些异常,是必须进行处理的,否则编译将会出错。比如,可以将上面的代码改成如下:
import java.io.*;
public class ExceptionExam2 {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("c:/a.txt");
// 其他处理代码
} catch (FileNotFoundException e) {
// Exception handling code here
}
}
}
Java语言规范中将Error的子类和RuntimeException的子类都称为“未检查(unchecked)的异常”,而将其他的异常均称为“已检查(checked)的异常”。
对于RuntimeException,都是可以通过程序中编写代码来将这种异常避免的,比如,首先对操作数进行判断,就可以避免出现被0除这种数学计算异常,或首先对数组的长度进行判断,就不会出现数组索引(下标)越界异常了。但我们没有办法通过编写代码来避免其他“已检查异常”的出现,比如,我们没办法编写一段代码用来判断用户是否输入了合法的或者真实存在的URL。如果程序中有可能出现“已检查异常”而没有对它进行处理,则在编译的时候会发生错误。
分享到:
相关推荐
GBase Connector for Java的安装相对简单,只需将jar文件(gbase-connector-java-8.3.81.53-build54.4.7-bin.jar)添加到Java项目的类路径中。通常,这可以通过以下几种方式实现: 1. 在IDE(如Eclipse、IntelliJ ...
4.2.8 Java异常断点..... 121 4.2.9 将程序与源代码相关联..... 123 4.2.10 热代码替换..... 123 4.3 远程调试...... 124 4.4 练习概述...... 125 4.5 本章小结...... 126 4.6 参考文献...... 127 第5章 协同使用...
CoreJava DAY01 Java概述 1 CoreJava DAY02 数据类型和控制结构 6 CoreJava DAY03 数组 11 CoreJava DAY04 15 CoreJava DAY05 面向对象 17 CoreJava DAY06 类的加载过程、实例化、继承、多态 20 CoreJava DAY07修饰...
2.11.1 概述.............................................................................................38 2.11.2 简单上传.................................................................................
4.2.8 Java异常断点..... 121 4.2.9 将程序与源代码相关联..... 123 4.2.10 热代码替换..... 123 4.3 远程调试...... 124 4.4 练习概述...... 125 4.5 本章小结...... 126 4.6 参考文献...... 127 第5...
4.2.8 Java异常断点..... 121 4.2.9 将程序与源代码相关联..... 123 4.2.10 热代码替换..... 123 4.3 远程调试...... 124 4.4 练习概述...... 125 4.5 本章小结...... 126 4.6 参考文献...... 127 第5...
第2 章 .NET Framework 概述 ............ 19 2.1 微软的信心来自于Windows .... 19 2.1.1 MSN 1.0 .................................. 20 2.1.2 .NET理念 .............................. 20 2.1.3 .NET...
现在有很多Java的Web框架可供选择,并且它们也都是免费的。例如: • Struts • Webwork • Tapestry • Spring MVC 以上框架都是非常优秀的。说实话,如果阿里巴巴网站在2001年开始,就有这么多可选择的话,...
Java EE 框架..................................................................................................................................................................................1 ...
81. **Polymorphism**: 多态,对象可以采用多种形态的能力。 82. **Interface**: 接口,定义了一组行为规范。 83. **Detail**: 细节,具体的描述或特征。 84. **Printer**: 打印机,输出设备,用于打印文档或图像。 ...
第1章 Java概述、安装及简易教学 14 1-1 Java概述 14 1-2 Java安装 16 1-3 Eclipse安装 18 1-4 GUI设计工具WindowBuilder 18 1-5 在Eclipse开发第一个Java程式 23 1-6 在Eclipse开发第一个Java视窗程式-显示影像 26 ...
81、public class Something { public int addOne(final int x) { return ++x; }}这个比较明显。 19 83、class Something { int i; public void doSomething() { System.out.println("i = " + i); }} 有什么错呢? 19...
13.1.1统一的数据访问异常 260 13.1.2通用的数据访问模板及抽象支持类 261 13.2spring的jdbc 262 13.2.1为什么需要jdbctemplate 262 13.2.2通过jdbcdaosupport使用jdbctemplate 263 13.2.3jdbctemplate提供的...
以上是《Java语言实验与课程设计指导》文档中提到的主要知识点概述。这些知识点涵盖了Java编程的基础到高级应用,对于学习Java编程的学生来说是非常宝贵的资源。通过这些实践项目的学习和实验,不仅可以掌握Java语言...
1 Java和面向对象概述 255 2 Java概述 256 2.1 安装并配置Java 平台 257 2.1.1 Java平台概述 257 2.1.2 Java平台的安装 257 2.2 第一个Java Application程序 257 2.2.1 编辑源程序 257 2.2.2 字节码的编译生成 259 ...
第11章 异常处理——Java世界的医生 195 11.1 异常处理的基本知识 195 11.1.1 try和catch捕获异常 195 11.1.2 异常的传播过程 198 11.1.3 finally语句块的使用 199 11.1.4 try、catch及finally语句块之间...
`EAppletException`专门用于处理与Java Applet相关的异常。 ##### 8. EArrayError `EArrayError`处理数组相关的错误,如越界访问等。 ##### 9. EAssertionFailed `EAssertionFailed`在断言失败时抛出,用于调试...