在java的异常类体系中:

  1.Error和RuntimeException是非检查型异常,其他的都是检查型异常;

  2.所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 ;

  3.不可以在不声明的情况下抛出非RuntimeException;

简单的说,非RuntimeException要自己写catch块处理掉。

1.RuntimeException

今天摩根IT电面的时候被问到Exception和RuntimeException的区别,当时答不出来,大囧,晚上来学习一下。

首先看一段代码,主要内容就是将字符串类型的数字转化为整型的数字,然后让两个数字相乘,代码如下:

public class RuntimeException {

    public static void main(String[] args) {
// TODO Auto-generated method stub
String str="123";
int temp=Integer.parseInt(str);
System.out.println(temp*temp);
}
}

产看parseInt方法的源代码如下:

  public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}

我们发现这个方法中抛出了NumberFormatException异常,但是在上面的代码中我们没有找到try...catch来处理,这是为什么呢。按照我们异常处理的知识,如果一个方法通过throws抛出了异常,那么可以在抛出异常的方法中不适用try...catch,但是在调用这个方法的地方必须有try...catch来处理。

下面来观察NumberFormatException类的继承关系:

从上图我们可以发现NumberFormatException是RuntimeException的子类,那么这就需要我们清楚Exception和RuntimeException的概念:

  1. CheckedException:在程序中必须使用try...catch进行处理。
  2. RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。

对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。

2.User Defined Exception

下面给出一个自定义异常的实例:

class MyException extends Exception{
public MyException(String msg){
super(msg);
}
} public class DefaultException { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
throw new MyException("自定义异常");
}catch(Exception e){
System.out.println(e);//edu.sjtu.ist.comutil.MyException: 自定义异常
//System.err.println(e);
// e.printStackTrace();
// StackTraceElement[] sts = e.getStackTrace();
// for (StackTraceElement st : sts){
// System.err.println(st);
// } // System.err.println(e.getStackTrace());
} } }

输出结果为:

MyException: 自定义异常

常见的RuntimeException- -

RuntimeException是开发中最容易遇到的,下面列举一下常见的RuntimeException:

1、NullPointerException:见的最多了,其实很简单,一般都是在null对象上调用方法了。

String s=null;
boolean eq=s.equals(""); // NullPointerException

这里你看的非常明白了,为什么一到程序中就晕呢?

public int getNumber(String str){
  if(str.equals("A")) return 1;
   else if(str.equals("B")) return 2;
}

这个方法就有可能抛出NullPointerException,我建议你主动抛出异常,因为代码一多,你可能又晕了。

public int getNumber(String str){
  if(str==null) throw new NullPointerException("参数不能为空");
//你是否觉得明白多了
  if(str.equals("A")) return 1;
   else if(str.equals("B")) return 2;
}

2、NumberFormatException:继承IllegalArgumentException,字符串转换为数字时出现。比如int i= 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:非法参数,在把字符串转换成数字的时候经常出现的一个异常,我们可以在自己的程序中好好利用这个异常.

本文转自:http://blog.csdn.net/feihong247/article/details/7873540

最新文章

  1. mysql排序时索引的注意事项
  2. MVC特性
  3. "德意志之歌"的历史
  4. 【转】Android项目中编译 C的模块
  5. jenkins api调用
  6. xss攻击入门
  7. Office 365 for TechNet 版本国家地区没有中国选项
  8. [开发环境] Ubuntu12.04 Telnet服务设置
  9. jira使用
  10. java--九九乘法表
  11. linux 添加定时任务脚本
  12. Unity应用架构设计(10)————绕不开的协程和多线程(Part 1)
  13. wampserver 的Apache启动错误提示:The requested URL / was not found on this server.
  14. 重新发现MATLAB
  15. 使用Python操作MongoDB
  16. [canvas]空战游戏1.18
  17. ccf碰撞的小球
  18. Origin绘制双Y轴图的方法
  19. 转 linux 权限
  20. linux——nginx的安装及配置

热门文章

  1. 盘点 DevOps 世界的杰出女性(一)
  2. How to use Mac Terminal
  3. Boost简介
  4. 暑假集训单切赛第一场 POJ 2309 BST(找规律的题)
  5. POJ1008Maya Calendar
  6. 简单易懂的现代魔法——Play Framework攻略4
  7. FFMpeg那些事——独立运行的二进制文件ffmpeg编译
  8. Java Socket文件上传
  9. no such partition grub rescue>
  10. java socket知识点