第5章 异常处理
5-1 程序中的错误有哪几种?分别能够在什么时刻被发现?
【答】 程序错误按照性质可分为3类:语法错、语义错、逻辑错。
1 语法错:违反语法规范的错误成为语法错( syntax error ),这类错误通常在编译时发现,又称为编译错,如标识符未声明、表达式中运算符与操作数类型不兼容、变量赋值时的类型与声明时的类型不匹配、括号不匹配、语句末缺少分号等。
2 语义错:如果在程序的语法上正确,但在语义上存在错误,则称为语义错( semantic error),又称为运行错(run-time error),语义错不能被编译系统发现,只有到程序运行时才能被发现,如输入数据格式错、除数为0错、给变量赋予超出其范围的值错等。
3 逻辑错:如果程序通过编译,可运行,但运行结果与期望值不符,则这类错误称为逻辑错(logic error),例如,由于循环条件不正确而没有结果,循环次数不对等因素导致计算结果不正确等。
5-2 Java为什么要采用异常处理机制?Java的异常处理是怎样实现的?异常处理机制能够解决程序中遇到的所有错误吗?哪些错误不是异常处理能够解决的?
【答】 异常处理和捕获和处理运行时错误的一种机制。异常处理机制使程序具有处理错误的能力。即使发生了运行错,应用程序能够捕获异常并及时处理异常,使程序从运行错误中很好地恢复并继续运行,而不会导致程序运行非正常终止。而且如果当前方法没有能力处理异常,还可以将异常转交给调用者处理。异常处理机制将运行时错误封装成若干错误类和异常类,并提供异常处理语句用于处理在程序中实现对运行时错误的发现和及时处理。异常处理机制并不能解决程序中的所有错误,例如内存溢出、栈溢出等。
5-3 请说出5个Java的异常类。
【答】 算术异常ArithmeticException、空对象异常NullPointerException、类型强制转换异常ClassCastException、负数组长度异常NegativeArraySizeException、数组下标越界异常ArrayIndexOutOfBundsException等
5-4 请问运行没有main()方法的类会怎样?
【答】 此类错误是Error类,当运行没有main()方法的类时,则产生类定义未找到的错误(NoClassDefFoundError)。
5-5 举例说明你在调试程序时,遇到过哪些错误和异常,采取什么办法解决问题的。
【答】1.无效的游标状态
修改:首先查看ResultSet是否为空,若为空则修改之;其次,也是我遇到的,就是:举个例子说明,如下
rs.getString(1);
rs.getString(3);//注意3和2的顺序颠倒了
rs.getString(2);//此时会出现异常
说明:ResultSet只能按顺序访问列的值,不能颠倒,我猜想这可能是JDBC的一个BUG吧。不过后来我看.NET中的DataReader类后才恍然大悟,原来,ResultSet的游标每向后移动,前面的数据就会被丢弃掉,这样做有利于提高访问速度。
2. ResultSet is closed
原因:一个Statement只能维持一个ResultSet为打开状态,后面的覆盖前面的,举个例子:
ResultSet rs1 = stmt.excuteQuery();
ResultSet rs2 = stmt.excuteQuery();
String s = rs1.getString(1);//出现异常,因为rs1已经被关闭
3. 连接占线导致另一个 hstmt
原因:一个Connection只能维持一个Statement为打开状态
一个例子:
Statement stmt1 = con.createStatement();
Statement stmt2 = con.createStatement();
stmts.excuteQuery(sql);//出现异常
其他异常
空指针异常
空指针异常应该说是最常见的异常了
原因主要有以下几点:
1.未初始化的变量(虽然已经声明)
2.使用了未初始化的对象(虽然已经声明)
注:引起这个异常的根本原因有可能隐藏的很深,空指针异常只不过是个表象而已(又被不幸的我遇到了).
5-6 如何处理除数为0异常?
【答】 进行除数运算时,先判断除数是否为0,若为0,则跳出提示。
5-7 怎样处理数组下标异常?
【答】 使用数组前先,判断下标是否小于数值长度,若不小于则提示数组下标有误。
5-8 说明采用什么语句能够捕获并处理异常?
【答】 Java提供try-catch-finally语句来捕获和处理一个或多个异常。其中,try、catch、finally是关键字。catch字句可以有一个或多个,但至少要有一个catch字句,finally字句可以省略。
5-9 为什么将字符串转换成数值类型时会抛出异常?抛出什么异常?
【答】 并不是所有的字符串都能转换成数值型,当遇到一个不能转转换成数值型的字符串时,Java抛出NumberFormatException异常。
5-10 说明throw语句与throws子句的区别。
【答】1.throws 用于抛出方法层次的异常, 并且直接由些方法调用异常处理类来处理该异常,所以它常用在方法的后面。比如 public static void main(String[] args) throws SQLException
2.throw 用于抛出代码层次的异常,常用于方法块里面的代码,常和try...catch ....语句块搭配实用,比throws的层次要低。
5-11 什么情况下需要自定义异常类?
【答】 当Java提供的异常类不能满足需要时,程序需要对自己抛出的异常类进行特殊处理,则可以自定义异常类。