我们先给出一个例子,看看异常有什么用?
public class Test {
public static void main(String[] args) {
int userInput=0;
int I = 6 / userInput;
System.out.println("优雅结束");
}
}
输出结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Test.main(Test.java:4)
public class Test {
public static void main(String[] args) {
try
{
int userInput=0;
int I = 6 / userInput;
}
/*系统把错误信息放在Exception的对象e中*/
catch(Exception e)
{
System.out.println(e);
}
System.out.println("优雅结束");
}
}
输出结果:
java.lang.ArithmeticException: / by zero
优雅结束
通过上面的例子,我们看出通过引入异常这种技术,即使出现不测(用户把0赋给除数),也可以让程序不崩溃,还能继续优雅的运行。这种技术有用,值得学。当你批量下载文件时,如出现什么错误,你是不是希望下载器能告诉你出现了什么问题,比如硬盘不足等等,在你提供了足够的硬盘空间以后,下载继续自动进行。而不是说空间一不足,立刻下载器就崩溃呀!这就是异常技术。
异常这种技术框架是怎么工作的?
注意是运行程序时,而不是编译时,当一个非正常情况出现,比如除0,就叫异常情况。
为了能优雅的处理异常情况(在出现异常情况后,程序不崩溃,还能继续优雅的运行), Sun公司设计了异常技术框架,你把可能出现问题的语句放在try块儿中,真出了问题的话,系统会把问题的信息存放在一个异常类的对象中传入到catch块中,在catch块儿中,你可以专门根据错误信息作处理。这样业务代码放在try块儿中,错误处理代码放在catch中,好处是易读,条理清楚。
!!没有try catch这种异常技术前,业务代码和排错代码是搅和在一起的!
我怎么知道哪块代码可能出现问题,从而放在try块儿中呢?
一个笨办法,开始时,你并不加try,但你发现,运行时,用户赋给除数一个0,所以程序在这崩溃了,于是你就把这块代码加个try,过两天,用户又犯了一个数组越界的错误,致使程序崩溃了。你又加了个try, 久而久之,你的try块儿就会变得越来越大,你的代码就会变得越来越健壮。再往后,你就有经验了,你自然知道常规的,只要用户可以赋给除数值时,就应该放在try块儿当中。
我怎么知道应该捕获什么样的异常?
如上例:开始没加try时,程序崩溃,系统打印的是如下的错误,Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.main(Test.java:4), 所以我们就该捕获ArithmeticException.见下例。
public class Test {
public static void main(String[] args) {
try
{
int userInput=0;
int I = 6 / userInput;
}
catch(ArithmeticException e)
{
System.out.println(e);
}
System.out.println("优雅结束");
}
}
输出结果:
java.lang.ArithmeticException: / by zero
优雅结束
顺便提一句,和Exception相对应的,还有Error,Error(错误)表示系统级的错误和程序不必处理的异常,是JRE(java运行环境)的内部错误或者硬件问题,比如,另外某一处地方的bug引起的内存溢出,内存资源不足等,OutOfMemoryError,对这类错误,程序基本无能为力,只能退出。
例:
public class Test {
/* maxMemory将返回java虚拟机所能返回的最大可用内存。0.92可以, 0.93就报错 */
int size win = (int) (Runtime.getRuntime().maxMemory() * 0.93);
public void allo() {
byte[] data1 = new byte[win];
}
public static void main(String[] args) {
Test t = new Test();
t.allo();
}
}
输出结果:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Test.allo(Test.java:5)
at Test.main(Test.java:9) |