97-什么是异常
我们写代码,程序可能发生各种错误。就好比我们开车,总有意想不到的时候:爆胎、没油、没电、零件坏了等等,这些问题都可能导致车没法开动。但是我们都要想到应对方法,比如没油要加油、没电要充电、爆胎要换备胎。
程序也类似,就算写得很严谨,也总有一些死角没考虑到。如果这些问题没解决或者碰到了,就可能导致程序挂掉、卡死。程序的这些错误不是编译时的错误,是运行时的错误。编译时的错误是可以解决的,否则编译无法通过。
程序开发中各种错误,有些可以避免,有些却是意想不到的。在Java中这些可能发生的错误被称为异常。异常也是类,我们甚至可以自定义自己的异常。
Throwable类
它是所有异常类的基类。该类有两个子类:一个是Error,一个是Exception。其中Error和其子类用于指示合理的应用程序不应该试图捕捉的严重问题;而Exception和其子类则给出了合理的应用程序需要捕捉的异常。
异常的分类
Java中可以捕捉的异常(Exception和它的子类)分为:
- 可控式异常:可以预知的错误,比如数据库连接不上、网络错误、文件被占用了等等。这些错误我们可以在程序中处理。
- 运行时异常:运行时才可能出现的错误。
可控式异常示例
File file = new File("G:\\JAVA\\java和C#区别.txtddd");
StringBuilder result = new StringBuilder();
BufferedReader br = null;
String s = null;
try {
br = new BufferedReader(new FileReader(file));
while ((s = br.readLine()) != null) {
result.append(System.lineSeparator() + s);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
System.out.println(result);Code language: JavaScript (javascript)
File file = new File("");
Reader reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1) {
System.out.print((char) tempchar);
}
reader.close();Code language: PHP (php)
异常的出现是运行时出现的,不一定会出现,它和环境或者用户操作方式有关。
98-运行时异常
有些错误是不能被编译器检测到的,比如当除数为零时。这些错误是在运行时才可能出现的,也未必一定会出现。
int[] arr = {1,2,3,4,5};
System.out.println(arr[5]);
输出:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at ListDemo.main(ListDemo.java:20)Code language: CSS (css)
我们可以通过写程序来避免:
int[] arr = {1,2,3,4,5};
int i = 5;
if (i > 4 || i < 0) {
System.out.println("索引不对");
return;
}
System.out.println(arr[i]);Code language: JavaScript (javascript)
Object obj = new Integer(123);
System.out.println(String(obj));Code language: JavaScript (javascript)
因为Integer不是String,所以转换出错:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at ListDemo.main(ListDemo.java:20)Code language: CSS (css)
ArrayIndexOutOfBoundsException:当我们访问数组的元素如果超出了数组索引的时候,就会报异常。
99-除零异常处理
当我们尝试除以0的时候,会抛出一个算术异常。我们可以避免除0,或者在报异常时处理。
int a = 12;
int b = 0;
int c = a / b;
System.out.println(c);
输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ListDemo.main(ListDemo.java:21)Code language: PHP (php)
100-获取异常信息
一旦程序有异常如果没有处理,就会抛出到操作系统(main方法外面),操作系统会让程序卡死。通过try catch可以获取出错时抛出的异常,然后获取异常的信息。
try {
//这里是可能出错的执行语句
} catch (Exception ex) {
//ex对象 就是异常错误对象 可以获取它的内容
}Code language: PHP (php)
Exception对象的一些方法
int a = 12;
int b = 1;
try {
int c = a / b;
System.out.println(c);
} catch (ArithmeticException ex) {
System.out.print(ex.getLocalizedMessage());
System.out.print(ex.getStackTrace());
}Code language: PHP (php)
101-处理异常
除了使用try catch,还可以使用try catch finally或者try finally。其中finally是用来做最后的断后操作,比如释放资源。finally的意思是最后,也就是不管有没有发生异常都会执行finally里面的代码。因为程序一旦发生错误可能就马上跳到catch,一些释放资源等操作可能就没有执行了。
try finally没有catch语句,也就是不对异常进行处理,只是在finally里面对一些必须的操作(比如释放内存资源)进行处理。
Eclipse中格式化代码快捷键:
Ctrl+Shift+F,或者右键代码 → Source → Format
102-throws抛出异常(带s)
如果不想进行try catch,可以在方法的后面加上throws把异常往外抛出。这样方法里面就可以不处理,让调用这个方法的地方进行处理。比如除0的异常本身不处理,往外抛出。
// throws IOException 的意思是如果出错了 自己不处理 把异常抛出到调用这个方法的地方
public static void main(String[] args) throws IOException {
File file = new File("H:\\JAVA\\java和C#区别.txt");
StringBuilder result = new StringBuilder();
BufferedReader br = null;
String s = null;
br = new BufferedReader(new FileReader(file));
while ((s = br.readLine()) != null) {
result.append(System.lineSeparator() + s);
}
br.close();
System.out.println(result);
}Code language: JavaScript (javascript)
多个异常用逗号隔开。
103-使用throw抛出异常(不带s)
可以在方法体里面抛出异常,这样可以自行抛出异常:
throw new Exception("错误说明");Code language: PHP (php)
使用throw比较灵活。多个catch的时候,特殊的异常要放在上面,否则会报错。
public static void main(String[] args) {
File file = new File("H:\\JAVA\\java和C#区别.txt1");
StringBuilder result = new StringBuilder();
BufferedReader br = null;
String s = null;
try {
if (!file.exists()) {
throw new Exception("你好,你选择的文件不存在,请再试一次。");
}
br = new BufferedReader(new FileReader(file));
while ((s = br.readLine()) != null) {
result.append(System.lineSeparator() + s);
}
br.close();
} catch (FileNotFoundException e) {
// 不能往外抛出e了 必须要处理
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(result);
}Code language: JavaScript (javascript)
public static void main(String[] args) {
try {
ShowShow();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void Show() throws Exception {
throw new Exception("xxxx");
}
public static void ShowShow() throws Exception {
Show();
}Code language: PHP (php)
104-自定义异常
通过继承Exception可以自定义自己的异常。异常也是类,也有构造函数。
public class BamnException extends Exception {
public BamnException() {
// TODO Auto-generated constructor stub
System.out.println("我们的异常");
}
public BamnException(String arg0) {
super(arg0);
System.out.println("我们的异常");
// TODO Auto-generated constructor stub
}
public BamnException(Throwable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public BamnException(String arg0, Throwable arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public BamnException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
// TODO Auto-generated constructor stub
}
}Code language: JavaScript (javascript)