目录
(2.3)throws:throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
一、异常结构。
二、异常的基础。
(1)java中异常以什么形式存在?
异常在java中以类的形式存在,每一个异常类都可以创建异常对象。
JVM执行到某一处觉得有异常,会new异常对象,并且将new的异常对象抛出,打印输出信息到控制台了。如:new ArithmeticException(“/ by zero”);
(2)抛出异常有三种形式:
一是throw,一个throws,还有一种系统自动抛异常。
下面它们之间的异同。
(2.1)系统自动抛异常
当程序语句出现一些逻辑错误、主义错误或类型转换错误时,系统会自动抛出异常。
(2.2)throw:throw是语句抛出一个异常。
语法:throw (异常对象);
如: throw e,一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。如:
[java] view plain copy
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException();
} else {
System.out.println(s);
}
//function();
}
会抛出异常:
Exception in thread "main" java.lang.NumberFormatException
at test.ExceptionTest.main(ExceptionTest.java:67)
(2.3)throws:throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
如: public void function() throws Exception{......}
当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。如:
[java] view plain copy
public static void function() throws NumberFormatException{
String s = "abc";
System.out.println(Double.parseDouble(s));
}
public static void main(String[] args) {
try {
function();
} catch (NumberFormatException e) {
System.err.println("非数据类型不能转换。");
//e.printStackTrace();
}
}
(3)java中处理异常有两种方式:
第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。谁调用我,我就抛给谁。
第二种方式:使用try…catch语句进行异常的捕捉。
异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果:终止java程序。(方法1 --> 方法2 --> … --> JVM)
(4)编译时异常和运行时异常的区别:
编译时异常一般发生的概率比较高。对于一些发生概率较高的异常,需要在运行之前对其进行预处理。
运行时异常一般发生的概率比较低。对于一些发生概率较低的异常,没必要提前对这种发生概率较低的异常进行预处理。如果处理这种异常,你会活的很累。
编译时异常也叫受检或受控异常:CheckedException;运行时异常也叫未受检或未受控异常:UnCheckedException。
(5)finally语句:
放在finally语句块中的代码是一定会执行(除了调用System.exit(0) 退出JVM),即使try中有return。如果try中有return,会先执行finally再return。
package com.itheima;
import java.util.LinkedList;
public class 集合的demo {
public static void main(String[] args) {
System.out.println(test());//返回20
}
public static int test(){
try {
return 10;
}finally{
return 20;
}
}
}
(6)异常对象两个重要的方法:
获取异常简单的描述信息:exception.getMessage();
打印异常追踪的堆栈信息:exception.printStackTrace();
三、编译时异常和运行时异常。
处理编译时期的异常有两种方式,具体如下:
(1)使用try…catch语句对异常进行捕获。
(2) 使用throws关键字声明抛出异常,调用者对其处理。
java常见异常有哪些?
编译时异常(需要强制处理)以及运行时异常(不需要强制处理)
常见的异常有:
OException:输入输出流异常
FileNotFoundException:文件找不到的异常
ClassNotFoundException:类找不到的异常
DataFormatException:数据格式化异常
NoSuchFieldException:没有匹配的属性异常
NoSuchMethodException:没有匹配的方法异常
SQLException:数据库操作异常
TimeoutException:执行超时异常
常见的运行时异常:
RuntimeException:运行时异常
NullPointerException:空指针异常
ArrayIndexOutofBoundsException:数组越界异
ClassCastException:类型转换异常
IllegalArgumentException:非法的参数异常
InputMismatchException:输入不匹配
编译时异常:
程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
运行期异常: 这意味着程序存在bug,如数组越界,0被除,入参不满足规范.....这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。
Java中用2种方法处理异常:
1、在发生异常的地方直接处理;
2、将异常抛给调用者,让调用者处理。
四、好的编程习惯:
1.在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;
2.用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
3.如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;
4.如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。