在运行时发生的不正常情况 描述不正常情况的类就是异常类 异常就是java通过面向对象的思想将问题封装成对象,用异常类进行描述 不同的问题用不同的描述
问题很多,描述的类也很多,将共性向上抽取,形成了异常体系,最终分成了两大类 Throwable:Thowable及其所有的子类都具有可抛性,throws,throw
throw new NullPointerException();
public class FushuIndexException extends Exception {
public FushuIndexException() {
}
public FushuIndexException(String message){
super(message);
}
}
Java异常可分为3种:
(1)编译时异常:Java.lang.Exception
(2)运行期异常:Java.lang.RuntimeException
(3)错误:Java.lang.Error
error和exception之间的区别:
error表示恢复不是不可能但很困难的情况下的一种严重问题。 比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
各种异常/错误出现的场景:
编译时异常: 程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
运行期异常: 这意味着程序存在bug,如数组越界,0被除,入参不满足规范.....这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。
错误: 一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。
getMessage():自定义信息 e.toString():异常类名+信息 printStackTrace():打印堆栈,JVM默认异常处理方法
catch(Exception e){} 父类catch必须放在最后,否则会报错
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
System.out.println("输入除数");
int num1 = scanner.nextInt();
System.out.println("输入被除数");
int num2 = scanner.nextInt();
double result = num1 / num2;
System.out.println(num1+"/"+num2+"="+result);
} catch (Exception e) {
System.err.println("除数不能为0");
System.out.println(e.getMessage());
e.printStackTrace();
}
finally {
System.out.println("finally");
}
}
import java.io.File;
import java.io.IOException;
import javax.imageio.IIOException;
import javax.naming.directory.AttributeInUseException;
import com.sun.org.apache.bcel.internal.classfile.Field;
public class TestExtendExp {
public static void main(String[] args) {
Person person = new Person();
person.fun();
}
}
class Person{
public void show() throws IOException {
}
public void method() {
}
public void fun() {
throw new ArrayIndexOutOfBoundsException(0);
}
}
class son extends Person{
//父类抛出了异常,子类可以抛出,也可以不抛出,如果抛出,必须是父类异常的子类
@Override
public void show(){
//Exception Exception is not compatible with throws clause in Person.show()
}
//父类没有异常,子类如有异常,必须用try/catch,不能方法抛出
@Override
public void method(){
////Exception Exception is not compatible with throws clause in Person.show()
try {
File file = new File("c:/e.txtg");
file.createNewFile();
throw new IOException();
} catch (Exception e) {
// TODO: handle exception
}
}
//抛出运行时异常,什么时候都可以
@Override
public void fun() {
try {
throw new IOException();
} catch (Exception e) {
// TODO: handle exception
}
}
}