Java IO流—异常及捕获异常处理 try…catch…finally
作者:CSDN-Lemon 发布时间:2023-03-14 07:35:52
一、Java IO流
1、概念
在Java中,把不同的输入源 / 输出源(如:键盘、文件、网络链接等)抽象的表述为“流”(stream)
通过 ”流“ 的形式允许Java程序使用相同的方式访问不同的输入 / 输出源
Java 把所有传统的”流“放在了 java . io 包下
2、IO流的分类(按流向划分)
输入流:只能从中读取数据,不能写入
输出流:只能写入数据,不能读取数据
3、IO流的分类(按操作单元划分)
字节流:操作单元是8位的字节,主要是 InputStream 和 OutputStream 作为基类
字符流:操作单元是16位的字符,主要是 Reader 和 Writer 作为基类
4、IO流的分类(流的角色划分)
节点流:可以向一个特定的 IO 设备(如磁盘等)读 / 写数据的流,也称为:低级流
处理流:用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能,也称为高级流
二、Java 异常
1、概述
Java在运行程序过程中出现的错误
2、常见的异常
空指针异常类:
NullPointerException
类型强制转换异常:
ClassCastException
数组下标越界异常:
ArrayIndexOutOfBoundsException
算术异常类:
ArithmeticExecption
数组负下标异常:
NegativeArrayException
3、异常的分类
三、异常处理方案
1、try…catch…finally
格式:
try {
可能出现问题的代码;
}catch(异常名 变量) {
针对问题的处理;
}finally {
释放资源;
}
代码:
package yichang01;
public class ExceptionDemo {
public static void main(String[] args){
System.out.println("start");
int[] arr = {1,2,3,4,5};
try {
System.out.println(arr[5]);
}catch (Exception e){
System.out.println("发生了异常:"+e.getMessage());
e.printStackTrace();//打印异常的栈
}finally {//有没有异常都会执行 finally 里的代码
System.out.println("释放资源,必须执行的代码块");
}
//System.out.println(arr[5]);//数组下标越界
System.out.println("end");
}
}
变形格式:
try {
可能出现问题的代码;
}catch(异常名 变量) {
针对问题的处理;
}
package yichang01;
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("start");
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("end");
}
}
注意:
try
里面的代码越少越好catch
里面必须有内容,哪怕给出一个简单的提示
四、try…catch 处理方式
1、一个异常的情况与多个异常的情况
package yichang01;
public class ExceptionDemo {
public static void main(String[] args) {
//method1();//一个异常的情况
//method2();//两个异常、分别处理的情况
//method3();//两个异常、一块处理的情况
method4();
}
private static void method4() {
int a = 10;
int b = 0;
int[] arr = {1, 2, 3};
try {
Object o = 123;
String s = (String) o; //ClassCastException
System.out.println(arr[3]); //IndexOutOfBoundException
System.out.println(a / b); //ArithmeticException
System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?");
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问了不该的访问的索引");
} catch (Exception e) {
System.out.println("出问题了");
}
System.out.println("over");
}
private static void method3() {
int a = 10;
int b = 0;
int[] arr = {1, 2, 3, 4, 5};
try {
System.out.println(a / b);
System.out.println(arr[5]);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("索引越界");
}
System.out.println("end");
}
private static void method2() {
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("end1");
int[] arr = {1, 2, 3, 4};
try {
System.out.println(arr[4]);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("end2");
}
private static void method1() {
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("end");
}
}
五、Throwable中的方法
1、getMessage()
获取异常信息,返回字符串。
2、toString()
获取异常类名和异常信息,返回字符串。
3、printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
4、printStackTrace(PrintStream s)
通常用该方法将异常内容保存在日志文件中,以便查阅。
package yichang01;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {
public static void main(String[] args) {
String s = "2019-06-17";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date d = sdf.parse(s);
System.out.println(d);
} catch (ParseException e) {
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
}
System.out.println("end");
}
}
六、throws
1、概述
定义功能方法时,需要把出现的问题暴露出来,让调用者去处理
package yichang02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {
public static void main(String[] args) throws ParseException {
System.out.println("start");
method1();
System.out.println("end11");
//method2();
System.out.println("end22");
}
private static void method2() throws ArithmeticException {//运行期异常抛出
int a = 10;
int b = 0;
System.out.println(a / b);
}
private static void method1() throws ParseException {//编译期异常抛出
String s = "2014-11-20";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(s);
System.out.println(d);
}
}
七、throw
1、概述
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,用 throw 把异常对象抛出
package yichang02;
public class ExceptionDemo {
public static void main(String[] args) {
Student s = new Student();
s.setAge(-30);
}
}
class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 1) {
this.age = age;
} else {
try {
throw new Exception("年龄不能小于1");//throw:方法内部,一般出现了逻辑错误,手动抛出的自定义异常
} catch (Exception e) {
e.printStackTrace();
}
this.age = 1;
}
}
}
八、throws和throw的区别
throws
用在方法声明后,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws 表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
抛出异常,由方法体内的语句处理
throw 则是抛出了异常,执行 throw 则一定抛出了某种异常
package yichang02;
class ExceptionDemo {
public static void main(String[] args) {
//method1();
try {
method2();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
private static void method2() throws Exception {
int a = 10;
int b = 0;
if (b == 0) {
throw new Exception();
} else {
System.out.println(a / b);
}
}
private static void method1() {
int a = 10;
int b = 0;
if (b == 0) {
throw new ArithmeticException();
} else {
System.out.println(a / b);
}
}
}
九、try…catch…finally…
1、格式
try...catch...finally
try...catch
try...catch...catch...
try...catch...catch...finally
try...finally
2、注意
被finally控制的语句体一定会执行
用于释放资源,在IO流操作和数据库操作中会见到
3、代码
package yichang02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
class ExceptionDemo {
public static void main(String[] args) {
String s = "2019-6-17 12:12:12";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = null;
try {
d = sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
System.exit(0);
} finally {
System.out.println("这是必然执行的代码");
}
System.out.println(d);
}
}
package yichang02;
class ExceptionDemo {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
return a;
} catch (Exception e) {
System.out.println("catch");
a = 30;
return a;
} finally {//释放资源,会执行的代码
System.out.println("finally");
a = 40;
return a;
}
// return a;
}
}
十、final , finally 和 finalize的区别
1、final
:最终的意思,可以修饰类,成员变量,成员方法
修饰类,类不能被继承
修饰变量,变量是常量
修饰方法,方法不能被重写
2、finally
:是异常处理的一部分,用于释放资源。
一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了
3、finalize
:是Object类的一个方法,用于垃圾回收
十一、异常注意事项
子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
来源:https://lemon-.blog.csdn.net/article/details/92412748
猜你喜欢
- java沙箱环境测试支付宝支付接口?准备工作,登陆支付宝开放平台,进入沙箱环境开放平台链接:https://developers.alipa
- 一. switch分支结构1. 简介switch结合case,能够判断一个变量或表达式与一系列值中的某个值是否相等,这里的每个值都被称为一个
- 使用Mybatis-Plus的SqlSessionFactory问题前些日子工作中出现一个问题,项目中使用了MybatisPlus,然后出现
- Spring Boot 2.7.6整合redis与低版本的区别最近在写程序的时候参考了之前写过的一篇文章spring boot整合redis
- Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager
- 为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平。你的一个决定会影响团队未来的几年。要考虑方面太多:
- summarydetail传统的Spring项目会有很多的配置文件,比如我们要使用Redis,一般除了对应的依赖的jar包我们还需要在app
- 一、项目概述之前有不少粉丝私信我说,能不能用Android原生的语言开发一款在手机上运行的游戏呢?说实话,使用java语言直接开发游戏这个需
- 想必我们在做项目的时候,都会遇到服务端与客户端交互数据。一般情况下我们都会采用json格式或者xml格式,将服务端的数据转换成这两种格式之一
- Java * 要想了解Java * ,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有
- 问题描述在开发批量删除功能时,往往都是多条数据,所以前台需要传一个数组给后台,但是怎么在URL中绑定一个数组,同时在后台用@PathVari
- URL(Uniform Resource Locator)是统一资源 * ,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,
- instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。 举个例子:public
- springboot + docker + jenkins自动化部署项目,jenkins、mysql、redis都是docker运行的,并且
- 本文实例讲述了Java使用备忘录模式实现过关类游戏功能。分享给大家供大家参考,具体如下:一.模式定义备忘录模式,在不破坏封闭的前提下,捕获一
- 0-1背包的问题背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重
- 1.前言在Mybatis中需要创建的配置文件有sqlMapconfig.xml,映射文件xxxMapper.xml,而这些文件在idea中并
- 导读Lombok:可以让你的POJO代码特别简洁,不止简单在BO/VO/DTO/DO等大量使用,还有设计模式,对象对比等MybatisPlu
- package TOOLS;import java.io.BufferedReader;import java.io.File;import
- 一、什么是代理?指为一个目标对象提供一个代理对象, 并由代理对象控制对目标对象的引用. 使用代理对象, 是为了在不修改目标对象的基础上,增强