在程序运行中,如果环境检测出一个不可能执行的操作,就会出现运行时错误(runtime error)。例如:
越界错误ArrayIndexOutOfBoundsException。
文件不存在错误FileNotFoundException等等。
Java中,异常会导致运行时错误。异常就是一个表示阻止执行正常进行的错误或情况。如果异常没有被处理,那么程序将会非正常终止。
应该处理这个异常,以便使得程序可以继续运行或平稳终止。
范例一:异常处理的创建、抛出、捕获以及处理异常。
运行效果如图所示:
实现的源代码如下:
package Blog;
public class blogTryProject{
//获取异常的信息
public static void main(String[]args){
try{
System.out.println(sum(new int[]{1,2,3,4,5}));
}
catch(Exception ex){
ex.printStackTrace();
System.out.println("\n"+ex.getMessage());
System.out.println("\n"+ex.toString());
System.out.println("\nTrace Info Obtained form getStackTrace");
StackTraceElement[] traceElements = ex.getStackTrace();
for(int i = 0;i < traceElements.length;i++){
System.out.print("method "+traceElements[i].getMethodName());
System.out.print("("+traceElements[i].getClassName()+":");
System.out.println(traceElements[i].getLineNumber()+")");
}
}
}
private static int sum(int[] list){
int result = 0;
for(int i = 0;i <= list.length;i++)
result += list[i];
return result;
}
}
主要有三个异常,ArithmeticException、FileNotFoundException和InputMismatchException在Java API中有很多预定义的异常类,如下图所示:
范例二:链式异常和finally语句。
运行效果如图所示:
实现的源代码如下所示:
package Blog;
public class blogTryProject{
public static void main(String[]args){
//链式异常
ChainedExceptionDemo ced = new ChainedExceptionDemo();
ced.main(args);
//finally语句演示
FinallyDemo fd = new FinallyDemo();
fd.main(args);
}
}
//链式异常
class ChainedExceptionDemo{
public static void main(String[]args){
try{
method1();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void method1()throws Exception{
try{
method2();
}
catch(Exception ex){
throw new Exception("New info from method1,",ex);
}
}
public static void method2()throws Exception{
throw new Exception("New info from method2");
}
}
//finally语句演示
class FinallyDemo{
public static void main(String[]args){
java.io.PrintWriter output = null;
try{
output = new java.io.PrintWriter("text.txt");
output.println("Welcome to Java");
}
catch(java.io.IOException ex){
ex.printStackTrace();
}
finally{
if(output != null) output.close();
}
System.out.println("End of program");
}
}
范例三:自定制异常。
运行效果如图所示:
实现的源代码如下所示:
package Blog;
public class blogTryProject{
public static void main(String[]args){
System.out.println("\n自定制异常");
try{
Circle c = new Circle();
c.setRadius(-5);
}
catch(InvalidRadiusException ex){
System.out.println("The invalid radius is "+ex.getRadius());
}
}
}
//自定制异常
class InvalidRadiusException extends Exception{
private double radius;
public InvalidRadiusException(double radius) {
super("Invalid radius "+radius);
this.radius = radius;
}
public double getRadius(){
return radius;
}
}
//带半径异常的圆类自定义异常
class Circle{
private double radius;
private static int numberOfObjects = 0;
public Circle(){
this(1.0);
}
public Circle(double newRadius){
this.radius = newRadius;
// setRadius(newRadius);
numberOfObjects++;
}
public double getRadius(){
return radius;
}
public void setRadius(double newRadius)throws InvalidRadiusException{
if(newRadius >= 0)
radius = newRadius;
else
throw new InvalidRadiusException(newRadius);
}
public static int getNumberOfObjects(){
return numberOfObjects;
}
public double findArea(){
return radius * radius * Math.PI;
}
}