赞
踩
总结了一下JAVA中常见的几种RuntimeException,大约有如下几种:
NullPointerException
-空指针引用异常
ClassCastException
-类型强制转换异常。
IllegalArgumentException
-传递非法参数异常。
ArithmeticException
-算术运算异常
ArrayStoreException
-向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException-下标越界异常
NegativeArraySizeException
-创建一个大小为负数的数组错误异常
NumberFormatException
-数字格式异常
SecurityException
-安全异常
UnsupportedOperationException
-不支持的操作异常
常见的RuntimeException- -
RuntimeException是运行时虚拟机的错误,不能被catch
RuntimeException是开发中最容易遇到的,下面列举一下常见的RuntimeException:
1、NullPointerException:见的最多了,其实很简单,一般都是在null对象上调用方法了。
Strings=null;
booleaneq=s.equals("");
// NullPointerException
这里你看的非常明白了,为什么一到程序中就晕呢?
public
intgetNumber(String str){
if(str.equals("A"))
return 1;
else
if(str.equals("B")) return 2;
}
这个方法就有可能抛出NullPointerException,我建议你主动抛出异常,因为代码一多,你可能又晕了。
public
intgetNumber(String str){
if(str==null) throw
new NullPointerException("参数不能为空");
//你是否觉得明白多了
if(str.equals("A"))
return 1;
elseif(str.equals("B"))
return 2;
}
2、NumberFormatException:继承IllegalArgumentException,字符串转换为数字时出现。比如inti=
Integer.parseInt("ab3");
3、ArrayIndexOutOfBoundsException:数组越界。比如
int[] a=new int[3]; int b=a[3];
4、StringIndexOutOfBoundsException:字符串越界。比如
String s="hello"; char c=s.chatAt(6);
5、ClassCastException:类型转换错误。比如
Object obj=new Object(); String
s=(String)obj;
6、UnsupportedOperationException:该操作不被支持。如果我们希望不支持这个方法,可以抛出这个异常。既然不支持还要这个干吗?有可能子类中不想支持父类中有的方法,可以直接抛出这个异常。
7、ArithmeticException:算术错误,典型的就是0作为除数的时候。
8、IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常,我们可以在自己的程序中好好利用这个异常。
我们可创建一个控制器,令其捕获所有类型的违例。具体的做法是捕获基础类违例类型Exception(也存在其他类型的基础违例,但Exception是适用于几乎所有编程活动的基础)。如下所示:
catch(Exception e)
{
System.out.println("caught an
exception");
}
这段代码能捕获任何违例,所以在实际使用时最好将其置于控制器列表的末尾,防止跟随在后面的任何特殊违例控制器失效。
对于程序员常用的所有违例类来说,由于Exception类是它们的基础,所以我们不会获得关于违例太多的信息,但可调用来自它的基础类Throwable的方法:
String
getMessage()
获得详细的消息。
String
toString()
返回对Throwable的一段简要说明,其中包括详细的消息(如果有的话)。
void
printStackTrace()
void
printStackTrace(PrintStream)
打印出Throwable和Throwable的调用堆栈路径。调用堆栈显示出将我们带到违例发生地点的方法调用的顺序。
第一个版本会打印出标准错误,第二个则打印出我们的选择流程。若在Windows下工作,就不能重定向标准错误。因此,我们一般愿意使用第二个版本,并将结果送给System.out;这样一来,输出就可重定向到我们希望的任何路径。
除此以外,我们还可从Throwable的基础类Object(所有对象的基础类型)获得另外一些方法。对于违例控制来说,其中一个可能有用的是getClass(),它的作用是返回一个对象,用它代表这个对象的类。我们可依次用getName()或toString()查询这个Class类的名字。亦可对Class对象进行一些复杂的操作,尽管那些操作在违例控制中是不必要的。本章稍后还会详细讲述Class对象。
下面是一个特殊的例子,它展示了Exception方法的使用
//:
ExceptionMethods.Java
// Demonstrating the
Exception Methods
package
c09;
public class
ExceptionMethods {
public static void
main(String[] args) {
try
{
throw new
Exception("Here's my Exception");
} catch(Exception e)
{
System.out.println("Caught
Exception");
System.out.println(
"e.getMessage(): "
+ e.getMessage());
System.out.println(
"e.toString(): " +
e.toString());
System.out.println("e.printStackTrace():");
e.printStackTrace();
}
}
}
///:~
该程序输出如下:
Caught
Exception
e.getMessage(): Here's
my Exception
e.toString():
java.lang.Exception: Here's my Exception
e.printStackTrace():
java.lang.Exception:
Here's my Exception
at
ExceptionMethods.main
可以看到,该方法连续提供了大量信息——每类信息都是前一类信息的一个子集。
本章的第一个例子是:
if(t ==
null)
throw new
NullPointerException();
看起来似乎在传递进入一个方法的每个句柄中都必须检查null(因为不知道调用者是否已传递了一个有效的句柄),这无疑是相当可怕的。但幸运的是,我们根本不必这样做——它属于Java进行的标准运行期检查的一部分。若对一个空句柄发出了调用,Java会自动产生一个NullPointerException违例。所以上述代码在任何情况下都是多余的。
这个类别里含有一系列违例类型。它们全部由Java自动生成,毋需我们亲自动手把它们包含到自己的违例规范里。最方便的是,通过将它们置入单独一个名为RuntimeException的基础类下面,它们全部组合到一起。这是一个很好的继承例子:它建立了一系列具有某种共通性的类型,都具有某些共通的特征与行为。此外,我们没必要专门写一个违例规范,指出一个方法可能会“掷”出一个RuntimeException,因为已经假定可能出现那种情况。由于它们用于指出编程中的错误,所以几乎永远不必专门捕获一个“运行期违例”——RuntimeException——它在默认情况下会自动得到处理。若必须检查RuntimeException,我们的代码就会变得相当繁复。在我们自己的包里,可选择“掷”出一部分RuntimeException。
如果不捕获这些违例,又会出现什么情况呢?由于编译器并不强制违例规范捕获它们,所以假如不捕获的话,一个RuntimeException可能过滤掉我们到达main()方法的所有途径。为体会此时发生的事情,请试试下面这个例子:
//:
NeverCaught.java
// Ignoring
RuntimeExceptions
public class
NeverCaught {
static void f()
{
throw new
RuntimeException("From f()");
}
static void g()
{
f();
}
public static void
main(String[] args) {
g();
}
}
///:~
大家已经看到,一个RuntimeException(或者从它继承的任何东西)属于一种特殊情况,因为编译器不要求为这些类型指定违例规范。
输出如下:
java.lang.RuntimeException: From
f()
at
NeverCaught.f(NeverCaught.java:9)
at
NeverCaught.g(NeverCaught.java:12)
at
NeverCaught.main(NeverCaught.java:15)
所以答案就是:假若一个RuntimeException获得到达main()的所有途径,同时不被捕获,那么当程序退出时,会为那个违例调用printStackTrace()。
注意也许能在自己的代码中仅忽略RuntimeException,因为编译器已正确实行了其他所有控制。因为RuntimeException在此时代表一个编程错误:
(1)一个我们不能捕获的错误(例如,由客户程序员接收传递给自己方法的一个空句柄)。
(2)作为一名程序员,一个应在自己的代码中检查的错误(如ArrayIndexOutOfBoundException,此时应注意数组的大小)。
可以看出,最好的做法是在这种情况下违例,因为它们有助于程序的调试。
另外一个有趣的地方是,我们不可将Java违例划分为单一用途的工具。的确,它们设计用于控制那些讨厌的运行期错误——由代码控制范围之外的其他力量产生。但是,它也特别有助于调试某些特殊类型的编程错误,那些是编译器侦测不到的。
覆盖一个方法时,只能产生已在方法的基础类版本中定义的违例。这是一个重要的限制,因为它意味着与基础类协同工作的代码也会自动应用于从基础类衍生的任何对象(当然,这属于基本的OOP概念),其中包括违例。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。