数据在传输的时候,有肯能会出现一些问题,那么我们需要对这些问题进行处理,那Java给我们提供了一套异常的处理机制
王帅,是一个骑行爱好者,某天骑着他的美利达山地车,去郊游,骑着骑着,车胎没气了, 运行期异常
如果说他骑着骑着,车轱辘飞了,那么这个问题,就属于大问题,他解决不了 Error 错误
他在出门之前,发现车闸松了,那么这个问题,必须解决, 不解决,不允许骑行 编译期异常
Throwable 异常或错误的父类
Error 错误 严重性问题 解决不了 如内存溢出
Exception 异常 一般性问题,可以解决
RuntimeException 运行期异常 可以解决,也可以不解决
非RuntimeException 编译期异常 必须解决
异常的基类: Throwable
严重问题: Error 不予处理,因为这种问题一般是很严重的问题,比如: 内存溢出
非严重问题: Exception
编译时异常: 非RuntimeException
运行时异常: RuntimeException
package org.westos.demo2;
public class MyTest {
public static void main(String[] args) {
//运行期异常,发生在程序运行期间,可以解决,也可以不解决,(如果不解决,交有JVM处理)
int a=1;
int b=0;
System.out.println(a/b);
//ArithmeticException(是RuntimeException的子类) ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
//我们没有处理这个运行期,那么默认交由了JVM去处理,那么JVM的处理方式是这样的: 在控制台,打印该异常的 异常信息,然后退出JVM (异常代码下面的代码均不执行)
//如果 你觉得JVM这种处理方式,不够友好,那么我们可以手动来处理
//我们可以尝试捕获这个异常来处理
System.out.println("下面的程序");
System.out.println("下面的程序");
System.out.println("下面的程序");
System.out.println("下面的程序");
}
}
try...catch处理异常的基本格式:
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}finally{
释放资源;
}
变形格式:
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}
注意事项:
a: try中的代码越少越好
b: catch中要做处理,哪怕是一条输出语句也可以.(不能将异常信息隐藏)
package org.westos.demo2;
public class MyTest2 {
public static void main(String[] args) {
int a=1;
int b=0;
try {
System.out.println(a / b); //这行代码有可能会出现异常//将这行代码放在try{}的括号里面
}catch (ArithmeticException e){
//catch()括号里面(ArithmeticException e)是捕获的异常类名ArithmeticException和给它起的名字e
//一旦遇到这个异常,怎么去处理
System.out.println("除数为0了");//catch(){}的{}里面是一旦遇到这个异常,怎么去处理
}
}
// System.out.println(a /b);这行代码我们自己尝试去处理(自己捕获异常并处理 不抛给虚拟机去处理 , JVM不会退出 会继续执行下面的代码)不影响下面程序的运行
System.out.println("下面的程序");
System.out.println("下面的程序");
System.out.println("下面的程序");
System.out.println("下面的程序");
}
}
try {
可能出现问题的代码 ;
}catch(异常名1 变量名1){
对异常的处理方式 ;
}catch (异常名2 变量名2){
对异常的处理方式 ;
}....
注意事项:
1:能明确的尽量明确,不要用大的来处理。
2:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面。
package org.westos.demo2;
public class MyTest3 {
public static void main(String[] args) {
int a = 1;
int b = 0;
int[] arr={
1,2};
arr=null;//置0后在System.out.println(arr.length);会出现空指针异常
//try:里面一般放置,有可能会出现问题的代码
//catch(某种异常); 一旦出现某种异常,catch 就会捕获该异常
//一旦try里出现该种异常,那么相应的catch就会执行
//捕获异常的注意事项:
// 1:能明确的尽量明确,不要用大的来处理。(便于了解出现的是哪类子类异常 不同的异常进入不同的处理逻辑)
// 2:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面。(要不然前面父类异常全都捕获了 对异常的处理逻辑变成一样的了 子类异常变成废代码了)
try {
System.out.println(a / b);
System.out.println(arr.length);
}catch (ArithmeticException e){
//一旦遇到这个异常,怎么去处理
System.out.println("除数为0了");
}catch (NullPointerException e){
//捕获 空指针异常
System.out.println("空指针异常");
}catch (Exception e){
//捕获 未知异常 (用一个父类Exception全部捕获)
System.out.println("未知异常");
}
System.out.println("下面的程序");
System.out.println("下面的程序");
System.out.println("下面的程序");
System.out.println("下面的程序");
}
}
JDK1.7中对多个catch的变形格式:
try {
可能出现问题的代码;
}catch(异常名1 | 异常名2 | .... 变量名){
对异常的处理方案;
}
好处: 就是简化了代码
弊端: 对多个异常的处理方式是一致的
注意事项:
多个异常之间只能是平级的关系,不能出现子父类的继承关系
1.处理方式是一致的。(实际开发中,好多时候可能就是针对同类型的问题,给出同一个处理)
2.多个异常间必须是平级关系。
package org.westos.demo2;
import java.util.prefs.BackingStoreException;
public class MyTest4 {
public static void main(String[] args) {
String str=null;
try {
System.out.println(1 / 0);
System.out.println(str.length());
}catch (NullPointerException | ArithmeticException | IllegalArgumentException e){
//JDK1.7 新加的语法: catch(...|...|...) 异常并列 (并列的多个异常间必须是平级关系) 但是对异常的处理逻辑是一样的 所以这种方法不推荐
if(e instanceof NullPointerException){
System.out.println("空指针异常");
}else if(e instanceof ArithmeticException){
System.out.println("除数为0异常");
}
}
}
}
编译期异常和运行期异常的区别
Java中的异常被分为两大类:编译时异常和运行时异常。
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
编译时异常: Java程序必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常: 无需显示处理,也可以和编译时异常一样处理
案例演示: 编译期异常和运行期异常的区别
package org.westos.demo2;
public class MyTest5 {
public static void main(String[] args) {
//选中有异常的代码 ctrl+alt+T 选择“6.try/catch” :异常处理快捷键 (这里给的是大异常Exception 建议自己再明确哪种异常)
//catch{}里面不能做空处理,即便你最简单写一条输出语句,提醒一下都行,不要做空处理
try {
System.out.println(1 / 0);
} catch (ArithmeticException e) {
//只有try里面遇到异常而且catch里面捕获了这种异常它才会进来{} :try里面一旦遇到该类异常,就进catch
e.printStackTrace();//调方法来 打印异常的堆栈信息:告诉你哪一行出现异常了 出现了哪类异常
//String message = e.getMessage(); //获取异常信息
// System.out.println(e.toString());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("aaaaaa");
}
}
面试题1: final,finally和finalize的区别
面试题2: 如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。
答:会执行, 在return前
例子如下:
try {
System.out.println(23 / 0);
} catch (Exception e) {
System.out.println("哦,catch了...............");
return ;
}finally {
System.out.println("哦,被执行了..............");
}
// 判断成绩范围
if(score > 100 || score < 0){
// 抛出一个异常对象
//注意 自定义异常类 提供有参数构造
throw new MyException("成绩不在有效的范围内(0~100)....") ;
}else {
System.out.println("成绩合法.....................");
}
如果JDK没有提供对应的异常,需要自定义异常。
创建功能
案例演示
File类的创建功能
注意事项:如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
相对路径:没有带盘符的路径
绝对路径:带有盘符的路径
删除功能
public boolean delete():删除文件或者文件夹
注意:删除文件夹时 这个文件夹是空文件夹 如果这个文件夹里面有文件,则不能删除
案例演示
File类的删除功能
注意事项:Java中的删除不走回收站。要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
重命名功能
public boolean renameTo(File dest):把文件重命名为指定的文件路径
案例演示
File类的重命名功能
注意事项:
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切。