[Android_Exception]Checked 和 Runtime Exception区别

  Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况。而在学Java 的时候,我们也只知道Exception
的写法,却未必真能了解不同种类的Exception 的区别。

  首先,您应该知道的是Java
提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception
(Checked Exception)。

  所有的Checked Exception
均从java.lang.Exception 继承而来,而Runtime Exception 则继承java.lang.RuntimeException
或java.lang.Error (实际上java.lang.RuntimeException
的上一层也是java.lang.Exception)。

  当我们撰写程序的时候,我们很可能会对选择某种形式的Exception
感到困扰,到底我应该选择Runtime Exception 还是Checked Exception


  其实,在运作上,我们可以通过Class 的Method
如何产生某个Exception以及某个程序如何处理这个被产生来的Exception
来了解它们之间的差异。
首先我们先建立一个Exception

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

然后我们撰写一个可能产生
CException 的 Class

public class
testException
{
public void method1() throws
CException
{
throw new CException("Test
Exception");
}

public void method2(String
msg)
{
if(msg ==
null)
{
throw new NullPointerException("Message
is null");
}
}

public void
method3() throws
CException
{
method1();
}

//
以下省略
// ...
}

  在这三个method
中,我们看到了method1 和method2 的程序码内都会产生Exception,但method3
的程序码中(大括号内),并没产生Exception,但在method3 的定义中,暗示了这个method
可能产生CException。

  呼叫method1() 的程序,必须将method1() 包含在try 与catch
中,如:

public class
runtest
{
// ....
public static
void main(String argv[])
{
testException te =
new
testException();
try
{
te.method1();
}
catch(CException
ce)
{
//
....
}
}
//
...
}

  虽然包含在try 与catch
中,并不表示这段程序码一定会收到CException,但它的用意在于提醒呼叫者,执行这个method
可能产生的意外,而使用者也必须要能针对这个意外做出相对应的处理方式。

  当使用者呼叫method2()
时,并不需要使用try 和catch 将程序码包起来,因为method2 的定义中,并没有throws 任何的Exception
,如:

public class
runtest
{
// ....
public static
void main(String argv[])
{

testException te
= new testException();

// 不会产生
Exception
te.method2("Hello");

// 会产生
Exception
te.method2(null);
}
//
...
}

  程序在执行的时候,也不见得会真的产生NullPointerException
,这种Exception 叫做runtime exception 也有人称为unchecked exception ,产生Runtime Exception
的method (在这个范例中是method2) 并不需要在宣告method 的时候定义它将会产生哪一种Exception


  在testException 的method3()
中,我们看到了另外一种状况,也就是method3里呼叫了method1() ,但却没有将method1 包在try 和catch
之间。相反,在method3() 的定义中,它定义了CException,实际上就是如果method3 收到了CException
,它将不处理这个CException ,而将它往外丢。当然,由于method3 的定义中有throws CException ,因此呼叫method3
的程序码也需要有try catch 才行。

  因此从程序的运作机制上看,Runtime
Exception与Checked Exception 不一样,然而从逻辑上看,Runtime Exception 与Checked Exception
在使用的目的上也不一样。

  一般而言,Checked Exception 表示这个Exception
必须要被处理,也就是说程序设计者应该已经知道可能会收到某个Exception(因为要try catch住) ,所以程序设计者应该能针对这些不同的Checked
Exception 做出不同的处理。

  而Runtime Exception
通常会暗示着程序上的错误,这种错误会导致程序设计者无法处理,而造成程序无法继续执行下去。

看看下面的例子:

String
message[] = {"message1",
"message2","message3"};
System.out.println(message[3]);

  这段程序码在Compile
时并没问题,但在执行时则会出现ArrayIndexOutOfBoundException 的例外,在这种状况下,我们亦无法针对这个Runtime
Exception 做出有意义的动作,这就像是我们呼叫了testException 中的method2 ,却引发了它的NullPointerException
一样,在这种状况下,我们必须对程序码进行修改,从而避免这个问题。

  因此,实际上我们应该也必须要去抓取所有的Checked
Exception,同时最好能在这些Checked Exception
发生的时候做出相对应的处理,好让程序能面对不同的状况。

  然而对于Runtime Exception
,有些人建议将它catch
住,然后导向其它地方,让程序继续执行下去,这种作法并非不好,但它会让我们在某些测试工具下认为我们的程序码没有问题,因为我们将Runtime Exception
"处理"掉了,事实却不然!譬如很多人的习惯是在程序的进入点后用个大大的try catch 包起来,如:

public
class runtest1
{
public static void main(String
argv[])
{
try
{
//...
}
catch(Exception
e)
{
}
}
}

  在这种情况下,我们很可能会不知道发生了什么Exception
或是从哪一行发出的,因此在面对不同的Checked Exception时,我们可已分别去try catch它。而在测试阶段时,如果碰到Runtime
Exception ,我们可以让它就这样发生,接着再去修改我们的程序码,让它避免Runtime
Exception,否则,我们就应该仔细追究每一个Exception ,直到我们可以确定它不会有Runtime Exception
为止!

  对于Checked Exception 与Runtime Exception
,我想应该有不少人会有不同的观点,无论如何,程序先要能执行,这些Exception 才有机会产生。因此,我们可以把这些Exception 当成是Bug
,也可以当成是不同的状况(Checked Exception),或当成是帮助我们除错的工具(Runtime
Exception),但前提是我们需要处理这些Exception ,如果不处理,那么问题或状况就会永远留在那里。

[Android_Exception]Checked 和 Runtime Exception区别,布布扣,bubuko.com

时间: 2024-12-16 06:25:58

[Android_Exception]Checked 和 Runtime Exception区别的相关文章

checked exception 与 runtime exception

Java存在三种可抛出结构(throwable):受检异常(checked exception).运行时异常(runtime exception)和错误(error).使用原则是: 1.如果期望调用者能够恢复,则应该使用受检异常.抛出受检异常,可以强迫调用者在一个catch子句中处理该异常,或者继续向外传播. 2.运行时异常是指难以恢复或者不可恢复的程序错误.大多数运行时异常都是表明前提违例(precondition violation指API的调用方没有遵循调用约定). 3.错误(error)

几种常见的Runtime Exception

摘要:一,error和exception的区别,RuntimeException和非RuntimeException的区别1.异常机制      异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.     传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通 一,error和exception的区别,RuntimeException和非RuntimeException的区别 1.

Co-variant array conversion from x to y may cause run-time exception

http://stackoverflow.com/questions/8704332/co-variant-array-conversion-from-x-to-y-may-cause-run-time-exception What it means is this Control[] controls = new LinkLabel[10]; // compile time legal controls[0] = new TextBox(); // compile time legal, ru

checked和unchecked的区别

int类型的最大值是2147483647,2个最大值相加就会超出int的最大值,即出现溢出. class Program { static void Main(string[] args) { int y = 2147483647; int x = 2147483647; int z = x + y; Console.WriteLine(z.ToString()); Console.ReadKey(); } } 把断点打在 int z = x + y;代码行,单步调试,可以看到z的值为-2.因为

最常见到的runtime exception:

最常见到的runtime exception:ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackE

checked exception和unchecked exception区别

http://blog.csdn.net/yuefengyuan/article/details/6204317 一. Java 中定义了两类异常: 1) Checked exception: 这类异常都是Exception的子类 .异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常.可能导致的问题:代码效率低,耦合度过高.C#中就没有使用这种异常机制. 2) Unchecked exception: 这类异常都是RuntimeException的子类,虽

最常见到的runtime exception 异常

ArithmeticException, 算术异常ArrayStoreException, 将数组类型不兼容的值赋值给数组元素时抛出的异常BufferOverflowException, 缓冲区溢出异常BufferUnderflowException, 缓冲区下溢异常 CannotRedoException, 不能重复上一次操作异常 CannotUndoException, 不能撤销上一次操作异常ClassCastException, 类型强制转换异常ClassNotFoundException

Android runtime Exception 整理

一般面试中java Exception(runtimeException )是必会被问到的问题 常见的异常列出四五种,是基本要求.更多的....需要注意积累了 常见的几种如下: NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常. IllegalArgumentException - 传递非法参数异常. ArithmeticException - 算术运算异常 ArrayStoreException - 向数组中存放与声明类型

【Java】Checked、Unchecked Exception

Checked Exception:需要强制catch的异常, Unchecked Exception:这种异常时无法预料的,即RuntimeException,就是运行时的异常. Exception及Error Exception: 1.可以是可被控制的(checked)或不可控制的(unchecked) 2.表示一个由程序员导致的错误 3.应该在应用程序级被处理 Error: 1.总是不可控制的(unchecked) 2.经常用来表示系统错误或低层资源的错误 3.如果可能的话,应该在系统级被