1、Java中捕捉异常语法结构如下:
如果没有设定catch区块,则一定要有finally区块。
2、异常一旦丢出,就不会再回到异常的丢出点了。
3、可控式异常是指某些情况下异常的发生是可预测的,编译器会要求必须处理。
例如在使用java.io.BufferedReader的readLine()方法时,编译器要求明确告知如何处理java.io.IOException,否则报错。
4、执行时异常是指异常发生在程序执行期间,并不一定可预测它的发生,编译器不要求一定要处理。
对于执行时异常若没有处理,则异常会一直往外丢,最后由JVM来处理,JVM所做的就是显示异常堆栈信息。
5、throw 和 throws
当程序发生错误而无法处理时,会丢出对应的异常,除此之外,还有两种情况:
1)想要自行丢出异常,例如在捕捉异常并处理结束后,再丢出,让下一层异常处理区块捕捉;
2)重新包装异常,将捕捉到的异常以自己定义的异常对象加以包装丢出。
6、若想要自行丢出异常,可以使用throw关键词,并生成指定的异常对象。例如:
throw new ArithmeticException();
举例说明:浮点数除以零
则可以使用throws关键词来声明这个方法将会丢出这个异常。例如:
java.io.BufferedReader的readLine()方法就声明会丢出java.io.IOException。
使用throws声明丢出异常的时机,通常是工具类的某个工具方法。如货币转换,日期。。。
因为作为被调用的工具,本身并不需要将处理异常的方式给定义下来,所以在方法上使用throws声明会丢出异常,
由调用者自行决定如何处理异常时比较合适的。
可以这样使用throws来丢出异常:
private void someMethod(int[] arr) throws ArrayIndexOutOfBoundsException,ArithmeticException
{
//实现
}
注意:方法上若会丢出多种可能的异常时,中间是使用逗点分隔;
当方法上使用throws声明丢出异常时,意味着调用者必须处理这些异常。
简单示例:
一类是严重的错误,例如硬件错误或内存不足,相关的类是java.lang下的Error类及其子类,这类错误程序无力自行恢复;
另一类是非严重的错误,代表可以处理的状况,程序有机会恢复正常,相关类是java.lang下的Exception类及其子类。
10、Error类与Exception类都继承自Throwable类,该类的几个取得相关异常信息的方法:
1)getLocalizedMessage()
取得异常对象的区域化信息描述
2)getMessage()
取得异常对象的信息描述
3)printStackTrace()
显示异常的堆栈信息,这个方法在追踪异常发生的根源是相当有用。例如:
A方法调用B方法,B方法调用C方法,C方法产生异常,则在处理异常时调用printStackTrace()可以得知
整个方法调用的过程,由此得知异常是如何被层层丢出的。
4)也可调用toString()方法取得异常的简单信息描述。
11、下面列出一些重要的异常继承架构:
被执行,事实上编译器也会检查这个错误。
try
{
//语句
}
catch(异常类型 名称)
{
//异常处理
}
finally
{
//一定会处理的区块
}
try区块可以搭配多个catch区块,如果设定了catch区块,则finally区块可有可无;
如果没有设定catch区块,则一定要有finally区块。
2、异常一旦丢出,就不会再回到异常的丢出点了。
3、可控式异常是指某些情况下异常的发生是可预测的,编译器会要求必须处理。
例如在使用java.io.BufferedReader的readLine()方法时,编译器要求明确告知如何处理java.io.IOException,否则报错。
4、执行时异常是指异常发生在程序执行期间,并不一定可预测它的发生,编译器不要求一定要处理。
对于执行时异常若没有处理,则异常会一直往外丢,最后由JVM来处理,JVM所做的就是显示异常堆栈信息。
5、throw 和 throws
当程序发生错误而无法处理时,会丢出对应的异常,除此之外,还有两种情况:
1)想要自行丢出异常,例如在捕捉异常并处理结束后,再丢出,让下一层异常处理区块捕捉;
2)重新包装异常,将捕捉到的异常以自己定义的异常对象加以包装丢出。
6、若想要自行丢出异常,可以使用throw关键词,并生成指定的异常对象。例如:
throw new ArithmeticException();
举例说明:浮点数除以零
public class Main
{
public static void main(String[] args)
{
try
{
double data = 100/0.0;
System.out.println("浮点数除以零:" + data);
if(String.valueOf(data).equals("Infinity"))
throw new ArithmeticException("除零异常");
}
catch (ArithmeticException e)
{
System.out.println(e);
}
}
}
7、如果在方法中会有异常的发生,但并不想在方法中直接处理,而想由异常方法的调用者来处理,
则可以使用throws关键词来声明这个方法将会丢出这个异常。例如:
java.io.BufferedReader的readLine()方法就声明会丢出java.io.IOException。
使用throws声明丢出异常的时机,通常是工具类的某个工具方法。如货币转换,日期。。。
因为作为被调用的工具,本身并不需要将处理异常的方式给定义下来,所以在方法上使用throws声明会丢出异常,
由调用者自行决定如何处理异常时比较合适的。
可以这样使用throws来丢出异常:
private void someMethod(int[] arr) throws ArrayIndexOutOfBoundsException,ArithmeticException
{
//实现
}
注意:方法上若会丢出多种可能的异常时,中间是使用逗点分隔;
当方法上使用throws声明丢出异常时,意味着调用者必须处理这些异常。
简单示例:
public class Main
{
public static void main(String[] args)
{
try
{
throwsTest();
}
catch (ArithmeticException e)
{
System.out.println("捕捉异常");
}
}
private static void throwsTest() throws ArithmeticException
{
System.out.println("这只是一个测试");
//程序处理过程中假设发生异常
throw new ArithmeticException();
}
}
8、简单的说,要么在方法中直接处理异常,要么就在方法上声明该方法会丢出异常,由调用者处理。
9、Java所处理的异常主要分为两大类:一类是严重的错误,例如硬件错误或内存不足,相关的类是java.lang下的Error类及其子类,这类错误程序无力自行恢复;
另一类是非严重的错误,代表可以处理的状况,程序有机会恢复正常,相关类是java.lang下的Exception类及其子类。
10、Error类与Exception类都继承自Throwable类,该类的几个取得相关异常信息的方法:
1)getLocalizedMessage()
取得异常对象的区域化信息描述
2)getMessage()
取得异常对象的信息描述
3)printStackTrace()
显示异常的堆栈信息,这个方法在追踪异常发生的根源是相当有用。例如:
A方法调用B方法,B方法调用C方法,C方法产生异常,则在处理异常时调用printStackTrace()可以得知
整个方法调用的过程,由此得知异常是如何被层层丢出的。
4)也可调用toString()方法取得异常的简单信息描述。
11、下面列出一些重要的异常继承架构:
Throwable
Error(严重的系统错误)
LinkageError
ThreadDeath
VirtualMachineError
...
Exception
(可控式异常)
ClassNotFoundExceptioon
CloneNotSupportedException
IllegalAccessException
...
RuntimeException(执行时异常)
ArithmeticException
ArrayStoreException
ClassCastException
...
12、在捕捉异常对象时,如果父类异常对象在子类异常对象之前被捕捉,则catch子类异常对象的区块将永远不会
被执行,事实上编译器也会检查这个错误。