异常
我们写代码是一定会有出错的时候,判断错误的类型,是我们解决它的第一要务。所以我们先来看一下异常。
听名字就知道这个东西是为了处理或者说是为了我们明白出错地方和出错类型的。
由此对它的定义:用于封装错误信息的对象。
那么它的基本构成是什么呢?
我们可以看到前半部分红字的翻译 “异常的线程main”,后边有java.lang应该是这个类的位置后边是错误信息和错误地点。
当然此处有一个点要注意“Exception”异常的例外的,也就是说这个异常的事情是可以修复的。而一旦此处变为"Error"那么就预示着出现了不可以修复的错误(程序逻辑错误)。
异常继承结构
运行时异常
RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等, 这些异常是不检查异常(可处理异常),程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常
RuntimeException以外的异常,类型上都属于Exception类及其子类, 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过,如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
异常的处理
我们采用两种方式来进行异常处理捕获和向上抛出。
捕获
try{
需要捕获的代码(可能出现异常的代码)
}catch(异常类型 异常名){
处理方案
}finally {
解决问题后,需要重新执行的代码
}
我们举个例子:
public class yichang {
public static void main(String[] args) {
int x=1;
int y =new Scanner(System.in).nextInt();
try {
System.out.println(x/y);
} catch (Exception e) {
// TODO: handle exception
System.out.println("y不能为0");
}
}
}
这个异常其实就属于运行时异常修饰词是Exception。
同时请注意
catch作为捕获错误,错误种类不同,捕获后补救的措施自然也不一样,所以catch可以有多个
finall作为仅仅是一个解决错误后是否需要回去执行的代码,自然只能有一个,并且不想重新执行刚开始错误的那段代码代码该关键字可以不写。
向上抛出
在感觉会出问题的方法后加入:throws 异常类型
举个例子:
public class yichang {
void play(int y)throws Exception {
if (y!=0) {
throw new Exception("y!=0");
}
}
public static void main(String[] args) throws Exception
{
int y = new Scanner(System.in).nextInt();
yichang y1 = new yichang();
y1.play(y);
}
}
我们定义一个当输入的y不是0的时候输出异常,那么我们看如果我们输入一个1会发生什么
我们看到这个错误被发现后,我们会把它发给main方法(调用它的方法)去解决,结果是解决不了,自然就出错了。
这个时候我们可能会想如果这个问题无法解决那么我要它何用,别慌
public class yichang {
void play(int y)throws Exception {
if (y!=0) {
throw new Exception("y!=0");
}
}
public static void main(String[] args) throws Exception
{
int y = new Scanner(System.in).nextInt();
yichang y1 = new yichang();
try {
y1.play(y);
} catch (Exception e) {
// TODO: handle exception
System.out.println(y);
}
}
}
通过这种方式我们可以让调用该方法的方法抓取错误类型,从而补救,这样就不会报错了。
自定义异常
正如我刚刚让y!=0作为异常一样,我们往往可以自己定义异常(现有的异常往往无法具体的表示出我们的错误)
此处我就不过多赘述了,代码如下:
public class yichang {
void play(int y)throws Exception {
if (y!=0) {
throw new Exception("y!=0");
}
}
public static void main(String[] args) throws Exception
{
int y = new Scanner(System.in).nextInt();
yichang y1 = new yichang();
y1.play(y);
}
}