赞
踩
如果程序员认为一段程序可能出现错误的时候就可以使用异常处理,基本的try-catch是
try {
可能出现异常的代码段
} catch (Exception e) {
e.printStackTrace();//打印出异常的堆栈跟踪信息到标准错误流(通常是控制台)。它会显示异常发生的位置、异常的类型以及调用栈的层次
}
使用这种方法进行异常处理,即使程序出错也会继续运行之后的代码,一般适用于即使遇到了一些不那么严重的问题也不会使程序崩溃
ctrl + alt + t
然后选择try-catch
程序执行中发生的不正常情况称为异常,开发过程中的语法错误和逻辑错误不是异常
Error(错误):java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况,比如:
Error是严重错误,程序会崩溃
Exception:其他因编程错误或偶然的外在因素导致的一致性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网路连接中断等,Exception分为两大类:
当应用程序试图使用该对象的时候,该对象为空
public class NullPointerException {
public static void main(String[] args) {
String name = null;
System.out.println(name.length());
}
}
当出现异常的运算条件时,抛出此异常。例如:一个整数“除以零”时,抛出此类的一个实例
用非法索引引发访问数组时抛出的异常。如果索引为负或者等于等于数组大小,则该索引为非法索引
public class ArrayIndexOutOfBoundsException {
public static void main(String[] args) {
int[] arr = {1,2,3};
for (int i = 0; i <= arr.length; i ++){
System.out.println(arr[i]);
}
}
当试图将对象强制转换为不是实例的子类时,抛出该异常
public static void main(String[] args) {
A b = new B(); //向上转型
B b2 = (B)b; //向下转型
C c2 = (C)b; //此时是不可以的,因为B和C类并没有关系,不能将B类的对象进行强转
}
}
class A{}
class B extends A{}
class C extends A{}
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。使用异常可以确保输入是满足条件数字
public class NumberFormatException {
public static void main(String[] args) {
String name = "韩顺平教育";
int num = Integer.parseInt(name); //这里的字符串并不能转换成int
System.out.println(num);
}
程序员在代码中捕获发生的异常,自行处理
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM
假如f2方法将异常抛出,则应该由调用它的f1方法来处理,当然,f1方法也有两种选择,直接try-catch来处理或者继续将异常抛出到main方法…
public class TryCatchDetail {
public static void main(String[] args) {
try {
String str = "史蒂夫";
int a = Integer.parseInt(str);
System.out.println("数字:" + a);
} catch (NumberFormatException e) {
System.out.println("异常信息=" + e.getMessage());
}
// System.out.println("继续");
}
}
这里出现异常,则后面的输出数字+a的语句就没有被执行
public static void main(String[] args) {
try {
String str = "123";
int a = Integer.parseInt(str);
System.out.println("数字:" + a);
} catch (NumberFormatException e) {
System.out.println("异常信息=" + e.getMessage());
}
// System.out.println("继续");
}
}
这里没有异常发生就没有执行catch中的语句
public class TryCatchDetail {
public static void main(String[] args) {
try {
String str = "史蒂夫";
int a = Integer.parseInt(str);
System.out.println("数字:" + a);
} catch (NumberFormatException e) {
System.out.println("异常信息=" + e.getMessage());
} finally {
System.out.println("finally代码块被执行!");
}
// System.out.println("继续");
}
}
可以看到这里出现异常但是finally中的语句还是执行了
public class TryCatchDetail02 { public static void main(String[] args) { //创建person对象然后调用getName方法 try { Person person = new Person(); person = null; String name = person.getName(); //NullPointerException System.out.println("name=" + name); int n1 = 10; int n2 = 0; int res = n1 / n2; //ArithmeticException } catch (NullPointerException e) { System.out.println("空指针异常"); } catch (ArithmeticException e) { System.out.println("算术异常"); } catch (Exception e) { System.out.println(e.getMessage()); } finally { System.out.println("finally"); } } } class Person { private String name = "jack"; //获取这个name public String getName() { return name; } }
public class TryCatchDetail03 {
public static void main(String[] args) {
try{
int n1 = 10;
int n2 = 0;
System.out.println("res=" + (n1 / n2));
}finally {
System.out.println("finally");
}
System.out.println("继续执行");
}
}
会被空指针异常捕捉到,但是,因为在finally中有返回值所以会覆盖前面的3,返回4
返回的是4
finally中没有返回值,但是catch中有返回值,此时先执行catch的时候并不返回,而是将那个变量作为临时变量存储,然后继续将finally执行完,最后返回的是那个临时变量,所以最后的输出是 i = 4, 3
public class TryCatchExercise04 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //创建Scanner对象 while (true) { //循环读取 System.out.println("请输入一个整数"); //提示输入 String str = scanner.next(); //获取用户输入的字符串 try { int num = Integer.parseInt(str); //将字符串转成int,如果出现异常,就会跳到catch System.out.println("num=" + num); //如果没有异常,就会执行这里 break; //跳出循环 } catch (NumberFormatException e) { System.out.println("输入的不是整数,请重新输入"); } } } }
实例:
public class Throws01 { public static void main(String[] args) { try { test(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (NullPointerException e) { e.printStackTrace(); } catch (ArithmeticException e) { e.printStackTrace(); } //被调用的方法,抛出多少异常,调用者就要处理多少异常,或者继续往上抛出 } public static void test() throws FileNotFoundException,NullPointerException,ArithmeticException{//这里可以抛出多个异常 //这里的异常,我们没有处理,而是抛出给调用者处理 FileInputStream fis = new FileInputStream("d://aa.txt");//FileNotFoundException是编译异常 } }
public class ThrowsDetails {
public static void main(String[] args) throws ArithmeticException{//这里是默认抛出的异常,可以不写
f1();
}
public static void f1() throws ArithmeticException{ //这里是默认抛出的异常,可以不写
int n1 = 10;
int n2 = 0;
System.out.println("res=" + (n1 / n2));
}
}
class Father {
public void method() throws Exception {
}
}
class son extends Father {
//子类重写父类的方法时,抛出的异常类型应该和父类的异常类型一致,或者是父类异常类型的子类
public void method() throws ArithmeticException {
}
}
class A {
public void method1() throws FileNotFoundException {
method();
}
public void method() throws FileNotFoundException {//这个方法抛出的是编译异常,所以调用他的方法必须处理
}
public void method2() {
method3();
}
public void method3() throws ArithmeticException {//这个方法抛出的是运行时异常,所以调用他的方法可以不处理
}
}
public class CustomException { public static void main(String[] args) { int age = 180; if (!(age >= 18 && age <= 120)) {//如果年龄不在18-120之间 //抛出异常 throw new AgeException("年龄需要在18-120之间");//抛出了自定义异常,并且调用构造方法,传入message,然后调用父类的构造器,输出message } } } //自定义的异常 class AgeException extends RuntimeException {//继承运行时异常 public AgeException(String message){ super(message);//调用父类的构造器,传入message,输出message } }
class Homework1 { public static void main(String[] args) { System.out.println("请输入两个整数:"); Scanner sc = new Scanner(System.in); String str1 = sc.next(); String str2 = sc.next(); try { int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); double res = Test.cal(num1, num2); System.out.println("res=" + res); } catch (NumberFormatException e) { System.out.println("输入的不是整数"); } catch (ArithmeticException e) { System.out.println("除数不能为0"); } } } class Test{ public static double cal(int num1, int num2) { return num1 / num2; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。