runtime exception和checked exception的区别?

来源:互联网 发布:刺客信条枭雄优化版 编辑:程序博客网 时间:2024/05/14 03:55
 

runtime exception和checked exception的区别?Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。

它们的不同之处表现在两方面:机制上和逻辑上。

一、机制上

它们在机制上的不同表现在两点:1.如何定义方法;2. 如何处理抛出的异常。请看下面CheckedException的定义:


public class CheckedException extends Exception
{
 public CheckedException() {}
 public CheckedException( String message )
 {
  super( message );
 }
}


以及一个使用exception的例子:


public class ExceptionalClass
{
 public void method1()
  throws CheckedException
  {
   // ... throw new CheckedException( "...出错了 " );
  }
 public void method2( String arg )
  {
   if( arg == null )
   {
    throw new NullPointerException( "method2的参数arg是null! " );
   }
  }
 public void method3() throws CheckedException
  {
   method1();
  }
}


你可能已经注意到了,两个方法method1()和method2()都会抛出exception,可是只有method1()做了声明。另外,method3()本身并不会抛出exception,可是它却声明会抛出CheckedException。在向你解释之前,让我们先来看看这个类的main()方法:


public static void main( String[] args )
{
 ExceptionalClass example = new ExceptionalClass();
 try
 {
  example.method1();
  example.method3();
 }
 catch( CheckedException ex ) { } example.method2( null );
}


在main()方法中,如果要调用method1(),你必须把这个调用放在try/catch程序块当中,因为它会抛出Checked exception。

相比之下,当你调用method2()时,则不需要把它放在try/catch程序块当中,因为它会抛出的exception不是checked exception,而是runtime exception。会抛出runtime exception的方法在定义时不必声明它会抛出exception。

现在,让我们再来看看method3()。它调用了method1()却没有把这个调用放在try/catch程序块当中。它是通过声明它会抛出method1()会抛出的exception来避免这样做的。它没有捕获这个exception,而是把它传递下去。实际上main()方法也可以这样做,通过声明它会抛出Checked exception来避免使用try/catch程序块(当然我们反对这种做法)。

小结一下:

* Runtime exceptions:

在定义方法时不需要声明会抛出runtime exception;

在调用这个方法时不需要捕获这个runtime exception;

runtime exception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。

* Checked exceptions:

定义方法时必须声明所有可能会抛出的checked exception;

在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去;

checked exception是从java.lang.Exception类衍生出来的

 

java.lang
Class Exception

java.lang.Object extended byjava.lang.Throwable extended byjava.lang.Exception 

Direct Known Subclasses:AclNotFoundException,ActivationException,AlreadyBoundException, ApplicationException, AWTException, BackingStoreException, BadLocationException, CertificateException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, DestroyFailedException, ExpandVetoException, FontFormatException, GeneralSecurityException, GSSException, IllegalAccessException, InstantiationException, InterruptedException, IntrospectionException, InvalidMidiDataException, InvalidPreferencesFormatException, InvocationTargetException, IOException, LastOwnerException, LineUnavailableException, MidiUnavailableException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NoSuchFieldException, NoSuchMethodException, NotBoundException, NotOwnerException, ParseException, ParserConfigurationException, PrinterException, PrintException, PrivilegedActionException, PropertyVetoException, RefreshFailedException, RemarshalException, RuntimeException, SAXException, ServerNotActiveException, SQLException, TooManyListenersException, TransformerException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URISyntaxException, UserException, XAException

 

The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch.

java.lang
Class RuntimeException

java.lang.Object extended byjava.lang.Throwable extended byjava.lang.Exception extended byjava.lang.RuntimeException 
Direct Known Subclasses:
ArithmeticException,ArrayStoreException,BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.

A method is not required to declare in its throws clause any subclasses ofRuntimeException that might be thrown during the execution of the method but not caught.

java.lang
Class Error

java.lang.Object extended byjava.lang.Throwable extended byjava.lang.Error 
All Implemented Interfaces:
Serializable
Direct Known Subclasses:
AssertionError,AWTError,CoderMalfunctionError, FactoryConfigurationError, LinkageError, ThreadDeath, TransformerFactoryConfigurationError, VirtualMachineError

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. TheThreadDeath error, though a "normal" condition, is also a subclass ofError because most applications should not try to catch it.

A method is not required to declare in its throws clause any subclasses ofError that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.  

java.lang
Class VirtualMachineError

java.lang.Object extended byjava.lang.Throwable extended byjava.lang.Error extended byjava.lang.VirtualMachineError 
All Implemented Interfaces:
Serializable
Direct Known Subclasses:
InternalError,OutOfMemoryError,StackOverflowError, UnknownError
原创粉丝点击