上这个课的时候我脑子很乱,我不理解try catch语句是要写哪里,还有throw throws的用法
throw要放在哪里,反正就是很多东西没有理解到位。
现在我们来从头到尾来梳理一遍
首先我们看一下下面这个代码
import java.util.*;
public class testdemo {
public static void main(String argu[]){
Scanner scanner=new Scanner(System.in);
int a=10;
int b=0;
int result=0;
result = a / b;
System.out.println("result="+result);
}
}
我执行这段代码 会发现出错
因为0不能做除数,报错如下,我们发现最后一句System.out.println("result")那句是输出不出来的
说明在result=a/b那一句直接发生断层了,后面直接不执行了。因为发生了异常。
然后我们介绍一下异常类
我们一般用系统已经给出来的异常类Exception,但是这个Exception应该放在哪里呢?
首先我们的Exception是不用自己写的,如果发生了错误,我们会直接产生Exception,那这个Exception要怎么用呢?怎么调用呢,他会产生在哪里呢?
我们来举一个简单的例子。
但首先我们要知道try catch 还有final语句
import java.util.*;
public class testdemo {
public static void main(String argu[]){
Scanner scanner=new Scanner(System.in);
int a=10;
int b=0;
int result=0;
try {
System.out.println("这句话是try内部的代码1,位于出错代码前面");
result = a / b;
System.out.println("这句话是try内部的代码2,位于出错代码后面");
}
catch (Exception shit) {
System.out.println("进入catch内的代码,可以调用Exception a了");
System.out.println("开始调用a的成员方法");
System.out.println(shit.getMessage());
System.out.println(shit.toString());
}
finally {
System.out.println("这是finally方法部分,无论发生什么都会执行这个部分");
}
}
}
这个是执行结果,你可以复制我的代码 自己去编程软件里面看一看,是不是一样的结果。
我们参照这样的输出结果,然后自己和我的代码一行一行的去对照,这个过程你一定要做。
不要让我给你解释 因为你记不住。
有同学看到这段代码就有点懵逼了,有点看不懂,我来给你解释一下。
package homwork4;
import java.util.*;
public class testdemo {
public static void main(String argu[]){
Scanner scanner=new Scanner(System.in);
int a=10;
int b=0;
int result=0;
try {
result = a / b;/*注意看这个地方,这个地方会发生错误
系统会自动生成一个Exception类的变量,但是你不知道,因为他是隐藏起来的
你要写一个变量去接受它。这就是我们下一行代码catch哪个代码做的事情*/
}
catch (Exception shit) /*
你可以随便给这个Exception起名字,你可以像我一样叫他shit,
你也可以叫他boy,girl,反正变量名是什么都可以
但记得下面调用的时候,也要记得一起改名字*/
{
System.out.println(shit.getMessage());//有同学不理解,比如我,这个getMessage是哪里来的?这个系统Exception类自动带的方法,就像Random,Scanner,一样都是自带的。
System.out.println(shit.toString());//toString也是Exception类自带的成员方法
}
finally {
System.out.println("这是finally方法部分,无论发生什么都会执行这个部分");
}
}
}
注意注意!!try catch finally这些语句都要写要执行的主函数里面,就是String Argu[]里面,不要把它揉到其他类里面。
讲完了系统自带的Exception类,我们现在要讲一讲自定义异常类(也就是自己写一个类,但这个类是通过继承系统自带的Exception类来的,所以肯定是Exception的子类)
package homwork4;//这个看不明白先不管 学了包再来看
class MyException extends Exception{
String message;//用来记录自己想要返回的信息
public MyException(int age)//
{
System.out.println("myexception的构造函数用来给成员变量message赋值");
message="message为记录age的值"+age;
}
public String toString(){
return message;
}
}
public class People {
private int age=1;
public int getAge(){
System.out.println("这是自己写的getAge函数,功能是返回age的数值");
return age;
}
public void setAge (int a)throws MyException//throws后面是你这个方法可能用到的自定义异常类 throws和throw相互呼应缺一不可
{
System.out.println("这是自己写的setAge函数,功能是改变age的数值");
if(a<=0||a>=100){
System.out.println("这是setage内部,同时当你看见现在这段文字的时候,说明已经超出范围了,我们要手动暂停程序,然后代替系统执行生成EXception类的行为");
throw new MyException(age);//你写throw的时候函数setAge后面必须要写throws
}
else{
this.age=a;
}
}
}
上面是People类和MyExtension的定义
下面是String主函数的执行代码
package homwork4;
import java.util.*;
public class testdemo {
public static void main(String argu[]){
int result=0;
People Patrick=new People();
People Edison=new People();
try
{
Patrick.setAge(180);
}
catch (MyException shit) //此时的shit在People里面已经被有参构造好了
{
System.out.println(shit.toString());
}
System.out.println("-----------------------------------");
try
{
Edison.setAge(87);
}
catch(MyException damn){
System.out.println(damn.toString());//如果成功这一行就不会执行
}
System.out.println("-----------------------------------");
}
}
同学们自己参照一下 一行行的对比。
大部分的注释我都写在代码里面的注意看看。
还听不懂就看这个视频Java 异常类基础知识_哔哩哔哩_bilibili