A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁志兵 中级黑马   /  2013-4-18 21:13  /  1986 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 梁志兵 于 2013-4-19 20:28 编辑

学基础时常见的异常都有哪些?希望各位朋友见到有的能帮总结一下

7 个回复

正序浏览
黑马-张明 发表于 2013-4-18 21:18
ArithmeticException - 算术运算中,被0除或模除ArrayIndexOutOfBoundsException - 数组越界访 ...

真多 不过还是谢谢各位的总结
回复 使用道具 举报
异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。
          其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种非严重的问题。

对于严重的,java通过Error类进行描述。
        对于Error一般不便携针对性的代码对其进行处理。

对于非严重的,java通过Exception类进行描述。
        对于Exception可以使用针对性的处理方式进行处理。

2,异常的处理

java提供了特有的语句进行处理。
try
{
        需要检测的代码;
}
catch(异常类 变量)
{
        处理异常的代码;(处理方式)
}
finally
{
        一定会执行的语句;
}
3,对捕获到的异常对象进行常见方法操作。
        string getMessage():获取异常信息
        toString():异常名称:异常信息
        printStackTrace():异常名称,异常信息,异常出现的位置。
                其实jvm默认的异常处理机制,就是在调用printStackTrace方法
                打印异常的堆栈中的跟踪信息。
在函数上声明异常。
便于提高安全性,让调用处进行处理。不处理编译失败。

对多异常的处理:

1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
        如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

建议在进行catch处理时,catch中一定要定义具体处理方式。
不要简单定义一句 e.printStackTrace()。
也不要简单的就书写一条输出语句。

如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。
所以子类只要在构造时,将异常信息通过super语句传递给父类。
那么就可以直接通过getMessage方法获取自定义的异常信息。

自定义异常:必须是自定义类继承Exception。

继承Exception的原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具有可抛性。这个可抛性是Throuable这个体系中独有特点。

只有这个体系中的类和对象次可以被throws和throw操作。

throws和throw的区别
throws使用在函数上。
throw使用在函数内。

throws后面跟的是异常类,可以跟多个,用逗号隔开。
throw后跟的是异常对象。

Exception中有一个特殊的子类异常RunTimeException 运行时异常。

如果在函数内中抛出该异常,函数上可以不用声明,编译一样通过。

如果在函数上声明了该异常,调用者可以不用进行处理。编译一样通过。

之所以不用再函数上声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,
希望停止运行后,对代码进行修正
回复 使用道具 举报
异常概述

1        什么叫异常
        编译错误:不能生成class文件;不叫异常!
        异常:运行class时出现错误。异常是运行时产生的不正常事件!

2 谁能产生异常
  只有行为才能产生异常,在java中就是方法能产生异常!

3 异常是方法返回的另一个途径
   public int fun() {}
我们说,调用fun()方法会返回一个int类型的值。但这是正常的时候!
调用这个方法也有可能返回一个异常对象!
方法现在有两种返回途径:正常返回声明的返回值类型,错误时返回异常对象!

4 异常的根类及两个子类
异常家族的领导者:Throwable(可抛出),异常的根类!
Error、Exception。
我们需要学习的是Exception。
Error:大错!无法挽回的!例如:内存溢出、JVM内部出错!
Excetpion:小错!
        可以避免的,也就是说,你小心一点,就不会出现的!不受检查
        外部不可抗拒的因素!这不是我们小心就可以处理的!受查检
所谓受不受查检,就是编译器管不管你!其实Error也不受检查!
编译器对异常有不同的看法,编译器对一些异常不管,对另一些异常就管理!

5 异常涉及的关键字
5个关键字
try(监控区)、catch(抓捕)、finally(总是执行)、throw(抛出)、throws(声明)

声明异常
声明异常不等于出现了异常,只是说方法有可能会出现异常!
1 声明异常的语法

public int fun() throws Exception, Error {
}

我们的fun()方法,正常时返回一个int
不正常时返回一个Exception类的对象


2 声明异常的方法说明什么
  一个方法如果声明了异常,就说明这个方法有两个返回途径,一个是正常返回,另一个是异常返回。

3 main也可以声明异常
public static void main(String[] args) throws Exception {
}

抛出异常

1 使用throw语句抛出异常
  throw new Exception();

2 执行了整数除以0的语句
  int a = 10 / 0;

3 调用了声明异常的方法有可能抛出异常
  fun1();//调用了一个声明异常的方法,也可能抛出异常。

4 当方法抛出异常后
  当方法真的抛出异常后,而且异常没有被捕获到,那么异常就抛出了。这个方法就返回了!但返回给调用者一个异常对象。

处理异常

1 包含“危险”语句
        整数除以0:肯定抛出异常,通常很少!
        调用声明异常的方法:不一定!
        throw语句:肯定抛出异常,通常会把它放到if之内!

2 声明异常
使用throws语句声明异常!
如果你的方法内部出现了“危险语句”,那么你可以给你的方法throws声明异常!

3 捕获处理异常
  如果你的方法内存在“危险”语句,那么你可以选择给你的方法声明异常,还可以选择捕获处理这个异常。

抓捕异常

1 抓捕异常的格式
  try…catch…finally

2 try…catch格式的执行流程
try {
} catch(异常类型 异常对象名) {
}
当在try中出现异常后,try中下面的代码就不会被执行了。然后去寻找与抛出异常类型匹配的catch,把异常对象交给这个catch来处理。当catch块执行完后,程序继承向下执行!

3 try…多catch格式及限制
   try {
} catch(异常类型1 e) {
}catch(异常类型2 e) {
}…

4 try…catch…finally格式执行流程
finally中的代码是“总是执行”。
当方法正常执行时,到了finally后,那么就执行finally中的代码。如果在到达finally之前,方法要返回(正常返回或异常返回),那么finally会插入执行,执行完finally之后,方法继续完成返回动作。

5 finally中放什么样的代码
需要总是执行代码。
例如:关闭IO流,或者关闭数据库连接。

6 当finally遇见System.exit(0)时
  只有遇见System.exit(0)时,finally才会不执行!

异常类方法介绍

1 Throwable介绍
        String getMessage():获取异常的信息。在创建异常类对象时,使用构造器给对象传递一个字符串,这个字符串就是那异常信息了。
        String toString():把异常对象转换成字符串表示形式。异常类名: 异常信息
        void printStackTrace():向控制台打印调用栈信息

2 Exception介绍
        Exception()
        Exception(String msg)
        Exception(Exception cause)
        Exception(String msg, Exception cause)
基本上所有异常类都有这么四个构造器!

受查检与不受检查

1 什么是受检查的,什么又是不受检查的
编译器只对受检查异常关心,不受检查的异常编译器不管。
不受检查:Error、RuntimeException
受检查:Exception中除了RuntimeException以外的都是受检查的!

2 不用处理不受检查的异常
受检查异常必须处理:要么声明、要么抓捕。
不受检查异常可以什么都不做,也可以声明,也可以抓捕。

3 catch抓捕受检查异常
  try中必须要存在这种可能!
                try {
                        System.out.println("hello");
                } catch (InterruptedException e) {
                }
因为try中不可能出现InterruptedExceptoin异常,所以编译不通过!因为InterruptedException是受检查异常!

                try {
                        System.out.println("hello");
                } catch (Exception e) {//当成不受检查,所以编译通过!
                }

        public static void fun() throws Exception {//当成受检查,如果者需要声明或try/catch这个异常!
        }
常见异常

1  OutOfMemoryError(内存溢出错误)
  内存溢出,通常是堆区溢出(方法区溢出也是它)

2  StackOverflowError(调用栈溢出错误)
  调用栈溢出,通常是无限递归!

3  NoSuchMethodError(没有这个方法错误)
  Demo调用了A.fun()方法,编译通过了,然后A类去除了A.fun()方法,再编译了A类,再去运行Demo时,出现这个错误!

4  NoClassDefFoundError(没有找到类错误)
  Demo依赖A类,编译通过了,但后来有人把A.class删除了,再去运行Demo,就出这个找不到A类了。

5  ArithmeticException(算法异常)
  算术异常!整数除以0时!

6  ArrayIndexOutOfBoundsException(数组下标越界异常)
  当下标下于0或者大于等于数组长度时,抛出这个异常!

7 ClassCastException
  类型转换异常,即强转失败

8 IllegalArgumentException
非法参数异常!
setAge(-123);//这个方法内部应该扫出这个非法参数异常!

9 NullPointerException
当使用null时抛出这个异常。

学习IO时,会遇到IOException
学习SQL时,会遇到SQLException

自定义异常
        从Exception类开始派生!继承Exception或其子类!
        给自定义的异常类起个好名字
        给自定义的异常写构造器(四个,与Exception类的四个构造器相同即可!)
1 从Exception或其子类派生自定义异常


2 给异常类起个好名字


3 给出与Exception一样参数的四个构造器


4 在适当的时候使用异常类


异常问题

1 
public static void fun1() throws Exception {}
public static void fun2() throws InterruptedException {}
public static void fun3() throws RuntimeException {}

调用谁不用处理
fun3()不用处理,因为RuntimeException是不受检查的

2
A, Exception B, InterruptedException C, RuntimeException
public static void fun() {
try {
} catch(? e) {}
}

问号处放什么类型的异常编译通过
AC

3 处理异常:try好还是throws好

  知道怎么处理那就try,不知道那就throws。

4 finally中有返回
  如果finally中有返回,那么其他的返回就没有意义了。

5 重写父类方法时声明异常的限制
  重写父类方法时声明的异常只能比父类方法少,不能多。

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2 问的是有哪些异常,而非异常是什么 ╮(╯▽.

查看全部评分

回复 使用道具 举报
Exception类可以分为两种:运行时异常和受检查异常。

  1、运行时异常

  RuntimeException类及其子类都被称为运行时异常,这种异常的特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。例如,当除数为零时,就会抛出java.lang.ArithmeticException异常。

  2、受检查异常

  除了RuntimeException类及其子类外,其他的Exception类及其子类都属于受检查异常,这种异常的特点是要么用try...catch捕获处理,要么用throws语句声明抛出,否则编译不会通过。

  3、两者的区别

  运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误的操作。一旦出现错误,建议让程序终止。

  受检查异常表示程序可以处理的异常。如果抛出异常的方法本身不处理或者不能处理它,那么方法的调用者就必须去处理该异常,否则调用会出错,连编译也无法通过。当然,这两种异常都是可以通过程序来捕获并处理的,比如除数为零的运行时异常

运行异常比较重要也比较常见一点。通过你见过异常的多少可以反映一个人写代码的多少。

我有两次笔试都考了这样的题,问见过哪个运行异常

运行异常比较常见的有:
NullPointerException:空指针异常类
ClassCastException:类型强制转换异常
ArrayIndexOutOfBoundsException数组越界异常

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
常出现的
Exception--->1、SQLException
              --->2、IOException
              --->3、RuntimeException(运行时异常)---->(1)NullPointerException(空指针异常)
                                                                      ---->(2)ArrayIndexOutOfBoundsException(数组索引越界异常)
                                                                      ---->(3)ClassCastException(类型转换异常)
                                                                      ---->(4)ArithmethicException(算术异常 如:除0)
                                                                      ---->(5)NumberFormatException(转换格式异常)
                                                                      ----->(6)IllegalArgumentException(非法参数异常)

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黑马-张明 于 2013-4-18 21:23 编辑

ArithmeticException - 算术运算中,被0除或模除
ArrayIndexOutOfBoundsException - 数组越界访问
ArrayStoreException - 数据存储异常,写数组操作时,对象或数据类型不兼容
ClassCastException - 类型转换异常
IllegalArgumentException - 方法的参数无效
IllegalThreadStateException - 试图非法改变线程状态,比方说试图启动一已经运行的线程
NullPointerException - 试图访问一空对象的变量、方法或空数组的元素
NumberFormatException - 数据格式异常,试图把一字符串非法转换成数值(或相反)
SecurityException - 如果Applet试图执行一被WWW浏览器安全设置所禁止的操作
IncompatibleClassChangeException - 如改变了某一类定义,却没有重新编译其他引用了这个类的对象。如某一成员变量的声明被从静态改变为非静态,但其他引用了这个变量的类却没有重新编译,或者相反。如删除了类声明中的某一域或方法,但没有重新编译那些引用了这个域或方法的类
OutOfMemoryException - 内存不足,通常发生于创建对象之时
NoClassDefFoundException - JAVA运行时系统找不到所引用的类
IncompatibleTypeException - 试图实例化一个接口,Java运行时系统将抛出这个异常
UnsatisfiedLinkException - 如果所需调用的方法是C函数,但Java运行时系统却无法连接这个函数
InternalException - 系统内部故障所导致的异常情况,可能是因为Java运行时系统本身的原因。
其中最常见的是下面三种:
1、 SQLException:操作数据库异常类。  现在的Java应用程序大部分都是依赖于数据库运行的。当Java应用程序与数据库进行沟通时如果产生了错误,就会触发这个类。同时会将数据库的错误信息通过这个类显示给用户。也就是说,这个操作数据库异常类是数据库与用户之间异常信息传递的桥梁。如现在用户往系统中插入数据,而在数据库中规定某个字段必须唯一。当用户插入数据的时候,如果这个字段的值跟现有的纪录重复了,违反了数据库的唯一性约束,此时数据库就会跑出一个异常信息。这个信息一般用户可能看不到,因为其发生在数据库层面的。此时这个操作数据库异常类就会捕捉到数据库的这个异常信息,并将这个异常信息传递到前台。如此的话,前台用户就可以根据这个异常信息来分析发生错误的原因。这就是这个操作数据库异常类的主要用途。在Java应用程序中,所有数据库操作发生异常时,都会触发这一个类。所有此时Java应用程序本身的提示信息往往过于笼统,只是说与数据库交互出现错误,没有多大的参考价值。此时反而是数据库的提示信息更加有使用价值。
2、 ClassCastException:数据类型转换异常。  在Java应用程序中,有时候需要对数据类型进行转换。这个转换包括显示的转换与隐式的转换。不过无论怎么转换,都必须要符合一个前提的条件,即数据类型的兼容性。如果在数据转换的过程中,违反了这个原则,那么就会触发数据类型转换异常。如现在在应用程序中,开发人员需要将一个字符型的日期数据转换为数据库所能够接受的日期型数据,此时只需要在前台应用程序中进行控制,一般不会有问题。但是,如果前台应用程序缺乏相关的控制,如用户在输入日期的时候只输入月、日信息,而没有年份的信息。此时应用程序在进行数据类型转换的时候,就会出现异常。根据笔者的经验,数据类型转换异常在应用程序开发中使一个出现的比较多的异常,也是一个比较低级的异常。因为大部分情况下,都可以在应用程序窗口中对数据类型进行一些强制的控制。即在数据类型进行转换之前,就保证数据类型的兼容性。如此的话,就不容易造成数据类型的转换异常。如在只允许数值类型的字段中,可以设置不允许用户输入数值以外的字符。虽然说有了异常处理机制,可以保证应用程序不会被错误的运行。但是在实际开发中,还是要尽可能多的预见错误发生的原因,尽量避免异常的发生。
3、NumberFormatException:字符串转换为数字类型时抛出的异常。  在数据类型转换过程中,如果是字符型转换为数字型过程中出现的问题,对于这个异常在Java程序中采用了一个独立的异常,即NumberFormatException。如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理。

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
异常分为两种1.编译异常,2.运行异常
异常的处理方式有1.捕获try--catch2.抛出throw
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马