Java基础知识:异常+流程控制

异常

1、概念

可以理解为就是程序出错了,示例:

package javase.base.exception;

public class TestError {
	public static void main(String[] args) {
		int i = 3/0;
		System.out.println(i);
	}
}

报错信息:不能除以0

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at javase.base.TestError.main(TestError.java:5)

2、异常的处理方式

  • throws -------抛出异常,自己不处理
  • try-cath------自己处理异常
    示例:
 package javase.base.exception;

public class TestException {
	public static void main(String[] args) throws Exception{
		//主动制造异常
		//模拟输入密码不正确,而向上抛出异常
		try {
			String password = "root";
			if( !"admin".equals(password) ) {
				//主动抛出错误
				throw new Exception("password error.");
			}
		} catch (Exception e) {	//捕获异常
			//主动抛出错误
			System.out.println(e.getMessage());
			throw new Exception("密码错误! ");
		}
		//完美体现流程控制
		//僵尸代码,不可能执行 Unreachable code
		//System.out.println("完成了");		
	}
}

3、处理异常步骤

  1. 抛出异常分两步:
    (1) 抛异常: throw new Exception(" ");
    (2) 接异常: throws Exception
  2. try—catch处理(示例):
package javase.base.exception;
public class TestError {
	public static void main(String[] args) {
		try {
			int i = 4/0;
			System.out.println(i);
		}catch(Exception e) {
			System.out.println("出错啦," + e.getMessage());
		}
	}
}
  1. finally 关键字:
    (死活都执行,对复杂对象变量的资源释放,例如:数据库的连接对象)
public class TestFinally {
	public static void main(String[] args) {
		try {	//try里面的代码必须执行
			String name = "tony";
			int i = 3/0;	//抛出异常
		} catch(Exception e) {	//只有出现异常才执行
			System.out.println(e.getMessage());
		} finally {	//死活都执行,对复杂对象释放资源
			System.out.println("看我执行了吗?");
		}
	}
}

4、异常的分类

  1. 编译时异常:
    在编译时期出错的,一定要处理,例如:
CloneNotSupportedException------克隆不支持异常
ParseException------------------解析异常
  1. 运行时异常:
    在编译时期没出错,在运行时期报错,可以处理也可以不做处理,属于RuntimeException都是运行时异常,其余的都属于编译时异常。例如:
ArithmeticException--------------算术异常
ArrayIndexOutOfBoundsException---数组下标越界异常
ClassCastException---------------类型转换异常
NumberFormatException------------数字格式异常

3.自定义异常:
a. 如果要抛出的异常类不存在,可以自定义异常类,需继承Exception默认就是编译时异常,也可以继承RuntimeException默认是运行时异常。
b. 如果方法抛出多少个编译时异常就要捕获多少个编译时异常
c. try块里存放时可能出错的代码 catch块里是针对try里出错的代码进行吧捕获处理
d. 异常如果被抛出后面的代码不会执行

//自定义异常类---继承Exception默认就是编译时异常
//如果自定义异常类继承RuntimeException/子类默认就是运行时异常
class PathNotExitsException extends Exception{
/*//私有化属性---报错信息
privateStringmessage;*/
//有参构造
public PathNotExitsException(String message){
//this.message=message;
super(message);//调用父类的有参构造
}
/*publicStringgetMessage(){
returnmessage;
}*/
 
}
class FileNotExitsException extends Exception{
//
public FileNotExitsException(String message){
super(message);//调用父类的有参构造
}
}
  • 异常的捕获:
public class ExceptionDemo2{ 
  public static void main(String[] args){
//调用方法读取文件中的内容
     try{//可能会出错的代码放到try块里
     Stringresult=readFile(null);//参数就是文件的路劲
}catch(PathNotExitsExceptione){//把检测到的异常进行捕获处理
//e对象就是下面方法抛出的自定义异常类的对象
System.out.println(e.getMessage());
}catch(FileNotExitsExceptione){//多个抛出的异常可以多个catch进行捕获
System.out.println(e.getMessage());//父类的方法
}catch(NullPointerExceptione){//可以处理运行时异常
//打印异常报错信息的栈轨迹
e.printStackTrace();
}
//如果异常被捕获处理后面的代码继续执行
//代码执行到这块
System.out.println("读取完成");
}
//读取文件内容的方法
//如果方法上抛出多个异常时yong,分割
//方法抛出多少个编译时异常就要处理多少个编译时异常

   public static StringreadFile(String path)throwsPathNotExitsException,FileNotExitsException,NullPointerException{
//读取文件内容
//传过来的文件路径可能为null
//判断参数是否为null
if(path==null){
throw new NullPointerException();//运行时异常可以处理也可以不处理
}
//要查找的盘符不存在---把问题的信息进行反馈
//把自定义异常类的对象往上抛出
if(path.startsWith("W"))//判断是否以W开头的盘符
throw new PathNotExitsException("亲,您路径不存在!!!");//编译时异常
 
//查找文件过程当中文件类型不对--把问题信息进行反馈
//判断文件后缀名是否是.txt
if(!path.endsWith(".txt")){//进判断说明后缀名不是.txt
//把异常类的对象进行返回
throw new FileNotExitsException("亲,您的文件后缀名不对!!!");//编译时异常
}
//把文件内容进行返回
//如果异常被抛出后面的代码都不会执行
return"文件的内容...";
}
}

流程控制

1、程序的三种基本结构:

  • 顺序结构:代码依次从上往下执行
  • 分支结构:根据判断有哪些代码执行,哪些代码不执行
  • 循环结构:反复执行一段代码

2、分支结构:if / switch–case

  • if 语句格式一

IF格式一:
if(判断条件){
代码块;
}
在这里插入图片描述

1、判断条件:可以是直接的Boolean类型的值;或者是运算结果为Boolean值的表达式
2、执行流程:
先执行判断条件,
如果true:执行代码块
如果false:if语句结束
3、注意:
if后边没有{}也可以正常编译运行,但是if控制的代码只能是紧跟在if后边的第一行代码;

  • if 语句格式二:

格式二: if(判断条件){
代码块1;
}else{
代码块2;
}
在这里插入图片描述
1、执行流程:
先执行判断条件,如果为true,则执行代码块1;如果为false,则执行代码块2;

  • if 语句格式三:

格式三:if else if else
if(判断条件1){
代码块1;
}else if(判断条件2){
代码块2;
}else if(判断条件3){
代码块3;
}

else{
代码块n;
}

在这里插入图片描述

  • switch ( )case{ }语句

格式: switch(值){
case 值1: 代码块1;
break;
case 值2: 代码块2:
break;
… default:
代码块n;
break;
}

1、执行流程:
使用值和值1,值2….一一匹配,如果相等,则执行该值对应的case的代码块;如果代码块中包含了break,则执行break结束switch case语句;如果没有break,则先执行当前case对应的代码块,之后的case的代码块、default的代码块的内容均会一一执行(case穿透);
2、注意:
switch中可以匹配的值得类型 int(byte short char) 枚举 JDK1.7开始支持String类型

3、循环结构

1、四要素:
初始化语句;判断条件;循环体;改变判断条件的语句;
2、分类:

  • while 语句

格式:
初始化语句;
while(判断条件){
循环体;
改变判断条件的语句;
}

1、执行流程:
a.初始化语句
b.判断条件:boolean值
true:
循环体;改变判断条件的语句
重复步骤2
false:
循环结束

while(true){
}

注意: 该循环是死循环

  • do …while 语句

格式:
初始化条件语句;
do{
循环体;
改变判断条件的语句;
}while(判断条件);

执行流程:
1、初始化条件语句;
2、循环体;
3、改变判断条件的语句;
4、判断条件
true:重复执行2-4
false:循环结束

do.while和while的区别:
do.while无论如何都会先执行一遍循环体;
while有可能循环体一次都不执行.

  • for 循环语句

格式:
for(初始化语句;判断条件;改变判断条件的语句){
循环体;
}
在这里插入图片描述

执行流程:
1.初始化条件语句;
2.判断条件:
true:循环体;改变判断条件的语句;重复步骤2
false:循环结束

for(;;){
System.out.println("hello");
}

**注意:**for()里的三个语句可以都为空,如果都为,循环是死循环

4、break、continue、return三者的区别

Break:
1.结束switch case
2.跳出循环
注意:
1.break默认跳出的是内层循环
continue
跳出本次循环,会跳过continue后面的语句,直接进行条件判断,进行下次循环
return主要功能
1、把方法的返回值进行返回
2、用于结束方法(void方法中也可以使用 return,但是只能单独使用)

本期给大家分享的就到此结束,下期给大家分享面向对象的内容,Java的一大核心,如果你读到我写的文章,觉得还不错,记得关注我哟,我每周都会给大家分享学习Java的干货,谢谢大家!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值