java异常
来源:互联网 发布:欧奈尔选股公式源码 编辑:程序博客网 时间:2024/05/29 03:58
public class Throwable extends Object implements Serializable :Throwable 类是 Java 语言中所有错误或异常的超类。
public class Error extends Throwable:Error类 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
public class Exception extends Throwable :Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
Exception又分为:
编译期问题:不是RuntimeException的异常。必须进行处理,如果不处理,编译就不能通过。
运行期问题:RuntimeException。这种异常不进行处理,出现问题是编写的代码不严谨。
Throwable中的方法:
getMessage():获取异常信息,返回字符串。
toString():获取异常类名和异常信息,返回字符串。
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
throw和throws的区别是什么?
throws:
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
public class ThrowDemo { public static void main(String[] args) { method(); } public static void method() { int a = 10; int b = 0; if (b == 0) { throw new ArithmeticException(); // throw:方法内部,抛出异常对象 } else { System.out.println(a / b); } }}
异常的处理
1、JVM的默认处理:JVM会把异常的名称,原因,位置等信息输出在控制台,但是程序就不能运行了。
2、由编码人员自己处理:
(1)通过try……catch……finally编写处理代码。这样后面的程序可以继续执行,不像JVM处理一样就直接退出了。
(2)throws:把处理不了的在方法上抛出声明,这样子调用者调用这个方法的时候就必须处理了这个异常了。
区别:
后续程序需要继续运行就try。
后续程序不需要继续运行就throws,因为调用了throws就相当于交给JVM处理,JVM就会停止程序,而不会执行这个后面的代码。
编译期异常必须要处理,否则编译不通过。
运行期异常可以不处理,也可以处理。
编译期异常的抛出,将来调用者调用它的时候就必须处理。
运行期异常的抛出,将来调用者调用它的时候可以不处理。
被finally控制的语句总是会执行么?
不一定。一般情况下被finally控制的语句体一定会执行。特殊情况:如果在执行finally之前JVM退出了(System.exit(0)),就不会执行了。
finally的作用是什么?
用于释放资源,在IO流操作和数据库操作中会用到
final,finally和finalize的区别是什么?
final:可以修饰类、成员变量、成员方法
修饰类:类不能被继承
修饰变量:变量是常量
修饰方法:方法不能被重写
finally:是异常处理的一部分,用于释放资源。一般来说finally控制的代码肯定会执行,特殊情况:在执行到finally之前JVM退出了finally控制的代码就不会执行
finalize:是Object类的一个方法,用于垃圾回收。
如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。?
会。在return前面执行。但是准确的说,是在return中间执行。
通过调试,我们可以发现程序是这么执行的:
public class FinallyDemo { public static void main(String[] args) { System.out.println(getInt()); //1 //9(控制台输出30) } public static int getInt(){ int a = 10; //2 try{ System.out.println(a / 0); //3(异常了,直接去执行catch) a = 20; }catch(ArithmeticException e){ //4 a = 30; //5 return a; //6 //8 //程序在执行到这一步的时候,这里不是return a而是return 30,这个返回路径就形成了。但是发现后面有finally,继续执行finally的内容,然后回到以前的返回路径,继续走return 30 }finally{ a = 40; //7(执行完之后,继续回到之前的返回路径) } return a; }}
但是如果也在finally之后加个return呢?这个时候输出的就是40了。
public class FinallyDemo { public static void main(String[] args) { System.out.println(getInt()); //1 //9(控制台输出40) } public static int getInt(){ int a = 10; //2 try{ System.out.println(a / 0); //3(异常了,直接去执行catch) a = 20; }catch(ArithmeticException e){ //4 a = 30; //5 return a; //6 }finally{ a = 40; //7 return a; //8 } }}
异常类还可以自己编写,那么具体是怎么弄得呢?
自定义异常:
1、继承自Exception(编译期异常)
2、继承自RuntimeException(运行期异常)
自定义一个编译器异常类:
public class MyException extends Exception { public MyException() { } //为了能够输出异常信息,创建有参构造,提供参数传递 public MyException(String message) { super(message); }}
自定义测试类如下:
public class Student { public void check(int age) throws MyException{ if(age > 40 || age < 10){ throw new MyException("年龄必须在10到40之间"); //调用自定义异常类的代餐构造,用来输出异常信息 }else{ System.out.println("正常"); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入年龄:"); int age = sc.nextInt(); Student student = new Student(); try { student.check(age); } catch (MyException e) { e.printStackTrace(); } }}
当输入的数据不符合要求的时候,会在控制台打印异常信息:
请输入年龄:123org.danni.demo1.MyException: 年龄必须在10到40之间 at org.danni.demo1.Student.check(Student.java:8) at org.danni.demo1.Student.main(Student.java:20)
注意:
1、子类覆盖父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
2、如果父类抛出了多个异常,子类覆盖父类时,只能抛出相同的异常或者是它的子集,子类不能抛出父类没有的异常
3、如果被覆盖的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
- java 异常,java,异常
- Java 异常 异常链
- Java异常
- Java 异常
- JAVA 异常
- Java异常
- java 异常
- Java异常
- java异常
- Java异常
- java异常
- java异常
- java异常
- java 异常
- java异常
- java异常
- java异常
- Java异常
- 多重背包
- 融会贯通——最常用的面向对象设计原则“合成复用原则”
- ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法
- php字符串数组相互转换
- 图的遍历(下)——邻接表
- java异常
- 如何查看linux版本信息
- 以Base64字符串形式上传文件——服务器端Java/Servlet接受请求数据中的字符串内容并转换成文件
- 1051. 复数乘法 (15)
- HTML5的基本结构
- Leetcode352——Data Stream as Disjoint Intervals
- 1008.Gnome Tetravex
- Nginx 教程二:利用nginx搭建静态文件服务、正向代理服务器、反向代理服务器
- 解决办法:CMake编译时出现“error in configuration process project files may be invalid”