Java异常2
如果try没有遇到问题,怎么执行?
会把try里面所有代码执行完毕,不会执行catch()里面的内容.
public class Main7 {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[0]);
System.out.println(2 / 1);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
}
System.out.println("看看我执行了吗!!");
}
}
如果try遇到多个问题,怎么执行?
我们要写多个catch与其对应
也就是说在try里面如果发生异常,下面的代码就会被打断,然后执行对应的catch操作,(catch运行完这个语句就结束了)如果我们没有进行这个对应的catch操作,JDK就会自己默认处理.
import java.net.PortUnreachableException;
public class Main6 {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[100]);
System.out.println(2 / 0);
String s = null;
System.out.println(s.equals("abc"));
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
} catch (ArithmeticException e) {
System.out.println("不能除以0");
} catch (NullPointerException e) {
System.out.println("空指针异常");
}
System.out.println("看看我执行了吗!!");
}
}
细节:
如果我们要捕获多个异常,这些异常存在父子关系的话,那么父类一定要写在下面.
在JDK7之后,我们可以在catch中捕获多个异常,中间使用|来进行隔开,表示如果出现了A异常或者B异常的话,采用同一种处理方案.
如果try中遇到的异常没有被捕获?
相当于try...catch代码没起作用,最后还是采用虚拟机默认进行处理.
public class Main7 {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6};
try {
System.out.println(2 / 0);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
}
System.out.println("看看我执行了吗!!");
}
}
如果try中遇到了问题,try下面的代码还会执行吗?
下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体,但是如果没有对应的catch与其匹配,那么还是会交给虚拟机默认处理.
public class Main7 {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[100]);
System.out.println("你好,嘿嘿嘿,看看我执行了吗!!");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
}
System.out.println("看看我执行了吗!!");
}
}
public class Main7 {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6};
try {
System.out.println(2/0);
System.out.println("你好,嘿嘿嘿,看看我执行了吗!!");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
}
System.out.println("看看我执行了吗!!");
}
}
异常中的常见方法
Throwable 的成员方法
按CRTL+L+T可以快速生成异常处理
其中 public void printfStackTrace() 比较常用.细节:仅仅是打印信息,不会停止虚拟机.(以红色字体进行打印.包含的信息最多.)
public class Main7 {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[100]);
} catch (ArrayIndexOutOfBoundsException e) {
String str = e.getMessage();//返回详细的字符串信息
System.out.println(str);
String s = e.toString();//返回简短的字符串信息
System.out.println(s);
}
System.out.println("看看我执行了吗!!");
}
}
public class Main7 {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[100]);
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();//把错误信息输出到控制台
}
System.out.println("看看我执行了吗!!");
}
}
错误输出:信息为红色,可能不符合程序的从上向下运行.
抛出异常
手动创建一个异常对象,并且把这个异常交给方法的调用者处理
此时方法就会结束,下面的代码就不会执行了.
就是自己在方法内进行异常处理,并且抛出,并且返回到调用处.
import java.util.Random;
public class Main4 {
public static void main(String[] args) {
// int a[] = {1, 2, 3, 4, 5, 6};
int a[] = null;
// int a[]={};
int ans = 0;
try {
ans = getmax(a);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
} catch (NullPointerException e) {
System.out.println("空指针异常");
}
System.out.println(ans);
//但是这个方法可能会出现异常.
}
public static int getmax(int[] arr)/* throws NullPointerException,ArrayIndexOutOfBoundsException*/ {//运行时异常throws可以不写
if (arr == null) {
throw new NullPointerException();
}
if (arr.length == 0) {
throw new ArrayIndexOutOfBoundsException();
}
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
}