-------------------------------------java异常分类和处理--------------------------------
异常 异常都是以Exception结尾的。
在我们写程序的时候难免会出现错误,java中的异常机制为了提高我们程序的健壮性和容错性而存在。
异常例子:
异常体系
Throwable: Throwable类是java语言中所有错误或异常的超类
java.lang
类 Throwable
java.lang.Throwable
所有已实现的接口:
直接已知子类:
-----------------错误-------------------
Error是throwable的子类,他是程序出现严重的问题,这种问题程序解决不了。
如:因为内存溢出或没有可用的内存提供给垃圾回收器时,java虚拟机无法分配一个对象,这时抛 出该异常。
错误都是以Error为结尾
如:
----------------------异常的分类------------------------
1. 编译期异常
编译期的异常我们必须处理,如果我们不处理就会编译失败。我们必须通过程序来处理编译期的异常
我们两种解决方案:抛出异常,把异常抛给调用当前方法的层内部处理,catch来处理。
除了RuntimeException都是编译期的异常
java.lang
类 Exception
java.lang.Exception
所有已实现的接口:
直接已知子类:
AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException, BackingStoreException, BadAttributeValueExpException, BadBinaryOpValueExpException, BadLocationException, BadStringOperationException, BrokenBarrierException, CertificateException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, DatatypeConfigurationException, DestroyFailedException, ExecutionException, ExpandVetoException, FontFormatException, GeneralSecurityException, GSSException, IllegalAccessException, IllegalClassFormatException, InstantiationException, InterruptedException, IntrospectionException, InvalidApplicationException, InvalidMidiDataException, InvalidPreferencesFormatException, InvalidTargetObjectTypeException, InvocationTargetException, IOException, JAXBException, JMException, KeySelectorException, LastOwnerException, LineUnavailableException, MarshalException, MidiUnavailableException, MimeTypeParseException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NoSuchFieldException, NoSuchMethodException, NotBoundException, NotOwnerException, ParseException, ParserConfigurationException, PrinterException, PrintException, PrivilegedActionException, PropertyVetoException, RefreshFailedException, RemarshalException, RuntimeException, SAXException, ScriptException, ServerNotActiveException, SOAPException, SQLException, TimeoutException, TooManyListenersException, TransformerException, TransformException, UnmodifiableClassException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URIReferenceException, URISyntaxException, UserException, XAException, XMLParseException, XMLSignatureException, XMLStreamException, XPathException
public class Exception
extends Throwable
Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
从以下版本开始:
JDK1.0
另请参见:
Error,序列化表格
--------------------------
importjava.net.ServerSocket;
publicclass test3 {
publicstaticvoidmain(String[] args) {
/**
* 有一些异常JVM能够预见到异常,它会让我们来处理
*/
ServerSocket ss = newServerSocket(8888);
}
}
2. 运行期异常
编译的时候可以通过,但是在运行的时候产生的异常叫做运行期异常。
所有RuntimeException的子类都是运行期的异常
java.lang
类 RuntimeException
java.lang.RuntimeException
所有已实现的接口:
直接已知子类:
AnnotationTypeMismatchException, ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, EnumConstantNotPresentException, EventException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IncompleteAnnotationException, IndexOutOfBoundsException, JMRuntimeException, LSException, MalformedParameterizedTypeException, MirroredTypeException, MirroredTypesException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NoSuchMechanismException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, RejectedExecutionException, SecurityException, SystemException, TypeConstraintException, TypeNotPresentException, UndeclaredThrowableException, UnknownAnnotationValueException, UnknownElementException, UnknownTypeException, UnmodifiableSetException, UnsupportedOperationException, WebServiceException
public class RuntimeException
extends Exception
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。
从以下版本开始:
JDK1.0
另请参见:
序列化表格
例子
---------------运行期异常的处理-------------------------------
第一种方法:自行解决。
Try{
//可能发生异常的代码
} catch(异常类型 变量名){
//处理异常的代码
}
如果把发生异常就不会产生异常的对象也不会进入catch
如果发生异常就会产生一个相应的异常这个异常的实例会传入到catch中,走catch中的代码。
如果异常得到处理(通过catch来处理了),catch{}后面的代码,调用端的后续代码也会得到执行。
异常中要掌握的方法:
---------------------------------------------------------------------
public String getMessage()
返回此 throwable 的详细消息字符串。
返回:
此 Throwable 实例(可以为 null)的详细消息字符串。
---------------------------------------------------------------------
public void printStackTrace()
将此 throwable 及其追踪输出至标准错误流。此方法将此 Throwable 对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。输出的第一行包含此对象的 toString() 方法的结果。剩余行表示以前由方法fillInStackTrace() 记录的数据。此信息的格式取决于实现,但以下示例是最常见的:
---------------------------------------------------------------------
public String toString()
返回此 throwable 的简短描述。结果是以下字符串的串联:
· 此对象的类的 name
· ": "(冒号和一个空格)
· 调用此对象 getLocalizedMessage() 方法的结果
如果 getLocalizedMessage 返回 null,则只返回类名称。
覆盖:
类 Object 中的 toString
返回:
该 throwable 的字符串表示形式。
---------------------------------------------------------------------
例子:
publicclass test2 {
publicstaticvoid main(String[] args) {
inta = 10;
intb = 0;
//a = a / b;
// 如果发生运行时的异常,后面的代码不会执行
divide(a,b);
System.out.println("-----------");
System.out.println(a);
}
publicstaticint divide(inta,intb) {
intc = 0;
try {
//如果下面这行代码发生异常,
//jvm就会创建出ArithmeticException的实列,
//传给catch中的变量。
c = a/b;
//在try语句块中如果发生异常,异常这行代码后面的不会执行
System.out.println("try中异常后面的代码");
}catch(ArithmeticException e ) {
//打印异常信息
Stringmes = e.getMessage();
System.out.println(mes);
System.out.println("**********************************************");
//把异常打印出来
e.printStackTrace();
System.out.println("***********************************************");
//打印出来具体的异常类和异常信息
Stringst = e.toString();
System.out.println(st);
System.out.println("发生了异常,我要处理了!");
}
// 如果发生运行时的异常,后面的代码不会执行
returnc;
}
}
第二种方法:向上抛出,如果不处理就会自动向上抛。
由于发生异常,把异常抛向上层。
由于执行者出现抛异常的情况,所以调用者必须处理异常所以如果不去处理那么后面的代码就不会执行
Try{}catch{}的快捷键 shift+alt+Z(需要选中异常)
列子:
publicclass test4 {
publicstaticvoid main(String[] args) {
inta = 10;
intb = 0;
//Try{}catch{}的快捷键 shift+alt+Z
try {
divide(a,b);
}catch (Exception e) {
e.printStackTrace();
System.out.println("调用者在处理异常");
}
System.out.println("-----------");
System.out.println(a);
}
publicstaticint divide(inta,intb) {
intc = 0;
//如果执行者不去处理就会自动的抛向调用者
c = a/b;
//由于上面的代码出现了异常,以下代码不会得到执行
System.out.println("-----------");
returnc;
}
-----------------------多种异常的处理-------------------------------------
在一段程序中可能产生多种异常
例子一:
publicclass test5 {
publicstaticvoid main(String[] args) {
inta = 10;
intb = 0;
//Try{}catch{}的快捷键 shift+alt+Z
divide(a,b);
}
publicstaticint divide(inta,intb) {
intc = 0;
try {
int[] arr = newint[10];
System.out.println(arr[10]);
c = a/b;
//数组越界异常
}catch (IndexOutOfBoundsExceptione) {
System.out.println("处理数组越界异常");
//数学异常
}catch(ArithmeticException e) {
System.out.println("处理数学异常");
}
System.out.println("-----------");
returnc;
}
}
例子二:
publicclass test6 {
publicstaticvoid main(String[] args) {
inta = 10;
intb = 0;
//Try{}catch{}的快捷键 shift+alt+Z
divide(a,b);
}
publicstaticint divide(inta,intb) {
intc = 0;
try {
int[] arr = newint[10];
System.out.println(arr[10]);
c = a/b;
}catch (Exception e) {
if(einstanceof ArithmeticException) {
System.out.println("处理数学异常");
}else {
System.out.println("数组越界异常");
}
}
System.out.println("-----------");
returnc;
}
}
------------------异常中的finally-------------------------
finally里面的代码无论何时一定会执行,主要用于释放资源
例子一:
try {
divide(a,b);
//finally里面的代码无论何时一定会执行,
//主要用于释放资源
}finally {
System.out.println("finally被执行");
}
例子二:
publicclass test8 {
publicstaticvoid main(String[] args) {
inta = 10;
intb = 0;
//Try{}catch{}的快捷键 shift+alt+Z
inti = divide();
//finally里面的代码无论何时一定会执行,
//主要用于释放资源
System.out.println(i);
}
publicstaticint divide() {
inti = 0;
inta = 9;
intb = 0;
try {
i = 2;
a = a/b;
returni;
}catch(Exception e) {
i = 3;
//执行了return放回值就保存下来了
//return后的finally无法改变已经形成了的返回值
returni;
}finally {
System.out.println("finally被执行到");
i = 4;
//这个return会修改返回值
returni;
}
}
}
------------------------------------------------------
Final,finally,finalize的区别?
1. Final可以修饰类,方法,属性,如果在类上,类不能被继承,如果在方法上不能重写,如果在属性上值不能改。
2. Finally是和异常try…catch异常处理模块一同使用的语句块,它在最后一定被执行。
3. Finalize当堆中的对象没有任何引用时,这个方法会被调用,来做垃圾回收。