1.Java Error 与 Exception
它们二者都有一个共同的祖先 Throwable。
对于Error是指正常情况下,出现几率小,难以把控的情况,绝大部分的Error都会对程序造成较大危害(出现无法运行等状况),无法抛出捕获。
Exception则是程序中,可以预料可把控的抛出,可以被捕获。
2.异常处理方式
1.异常抛出(抛出不处理):
当程序中可能出现异常,但开发者又不想在本层处理异常时就需要抛出异常给上一级调用时进行处理。在异常抛的处理中又可分为显式抛出和隐式抛出。
当异常是RunTimeException或者其子类时,对于程序方法可以不做任何声明抛出地被调用,并且编译能通过。
其他类异常则需要在方法的‘{’前添加 throws+异常类型的显式声明抛出。
用例:
public class Test{
public static void main(String[] args) throws IOException {
BufferedReader keyin=new BufferedReader (new InputStreamReader(System.in));
String c1;
int i=0;
String[] e=new String[10];
while(i<10) {
c1=keyin.readLine();/*此处出异常时会抛出异常对象*/
e[i]=c1;
i++;
}
}
异常捕获(异常处理):
try {} catch() 语句可用于异常捕获。对于某些可能出现异常的语句一般写在try内,catch中则设置异常类型对(显式隐式都是)抛出的异常进行捕获,也可依照设计需求增添finally语句作为统一出口。
try {
while(i<10) {
c1=keyin.readLine();
e[i]=c1;
i++;
}
}
catch(IOException e1) {
e1.printStackTrace();
}
使用try catch后,语段中出现异常时会运行端会输出封装好的异常内容。
3.举例RunTimeException
用异常父类Exception可对异常进行捕获
常出现的RunTimeException错误有:
(1)算术异常ArithmeticException:
public class Test{
public static void main(String[] args){
int[] m= {1,2,3,4,0};
int ans=0;
try {
for(int i=0;i<m.length;i++) {
ans=+3/m[i];
System.out.println(ans);
}
}
catch(Exception e1) {
e1.printStackTrace();
}
}
}
此时系统抛出:
(2)空指针异常
对象引用在声明后未初始化就使用会造成空指针异常:
public class Test{
public static void main(String[] args){
try {
Integer c,c1;
int ans=0;
for(int i=0;i<2;i++) {
ans=+c.intValue();
System.out.println(c.equals(c1));
}
}
catch(Exception e1) {
e1.printStackTrace();
}
}
}
未初始化数组也同样是如此
public class Test{
public static void main(String[] args){
try {
int []a;
int ans=0;
for(int i=0;i<2;i++) {
System.out.println(a[0]);
}
}
catch(Exception e1) {
e1.printStackTrace();
}
}
}
(3)空栈异常:
在栈对象中,如果在栈中无任何对象引用时使用了pop()方法就会发生空栈异常。
import java.util.*;
public class Test{
public static void main(String[] args){
try {
Stack st=new Stack();
Object ob=st.pop();
}
catch(Exception e1) {
e1.printStackTrace();
}
}
}
抛出异常:
(4)数组越界异常:
public class Test{
public static void main(String[] args){
try {
String fo=args[1];
System.out.println(args[0]);
}
catch(Exception e1) {
e1.printStackTrace();
}
}
}
抛出异常:
(5)类转换异常
在类转换时如果进行的不适当则会出现类转换异常。下面代码中将String强制转换为Integer类,这是无法直接利用强制转换符实现的。
public class Test{
public static void main(String[] args){
try {
Object x = new String("String");
System.out.println((Integer) x);
}
catch(Exception e1) {
e1.printStackTrace();
}
}
}
此时抛出异常:
4.自定义异常样例
我创建了一个值不能等于4的异常:
class EqualsFourException extends Exception{
EqualsFourException(String msg){
super(msg);
}
}//继承异常祖先类
public class Test{
public static void main(String[] args)throws EqualsFourException{
try {
int a=0;
while(a!=5) {
a++;
if(a==4)
throw new EqualsFourException("a等于4");
}
}
catch(Exception e1) {
e1.printStackTrace();
}
}
}
当a在循环自增过程中值为4时,便会抛出异常: