异常 throw、throws、trycatch、自定义异常

Alt + Insert(Fn + Enter):在idea中点击包,按快捷键,创建类

异常:就是程序出现不正常的情况。程序在执行过程中,出现非正常的情况,最终会导致JVM的非正常停止

注意:语法错误不算在异常体系中

异常体系:

ThrowableError

严重问题

例:内存溢出

(无需操作,因为代码解决不了,要解决只能加内存)

Exception

RuntimeException

运行时异常

例:空指针异常、数组索引越界异常

其他

注意:其他的都是继承自Exception,为编译时异常,必须修改,不然编译不了

注意:

继承自RuntimeException为运行时异常

继承自Exception为编译时异常

但RuntimeExceptio又继承自Exception

编译时异常和运行时异常:

javac.exe  编译时异常:是在编译成class文件时必须要处理的异常(也称受检异常)

java.exe  运行时异常(非受检异常)

异常的执行流程:

当代码出现异常,就会改行代码后创建一个异常对象

例:new ArrayIndexOutofBoundsException();

首先会看,程序中有没有自己处理异常的代码

如果没有,交给本方法的调用者处理(例:main方法的调用者为JVM虚拟机)

最终这个异常会交给虚拟机默认处理

虚拟机默认处理异常的方式:

1.讲异常信息以红色字体展示在控制台上(异常信息包含:异常名称、原因、位置等)

2.停止程序运行(哪里出异常就会在哪里停止,且后面的代码都不会执行)

声明异常:throws

不处理异常,直接交给调用者处理,即JVM,作用是说代码可能存在这个问题

格式:throws 异常类名

位置:在方法声明的后面

例:public void mm throws Exception(){  }

注意:

运行时异常可以省略不写

编译时异常必须声明,即必须写

为什么编译时异常必须写呢?

javac.exe  编译时异常:是在编译成class文件时必须要处理的异常(也称受检异常)

抛出异常对象:throw

格式:throw new 异常();

注意:这个格式是在方法内的,表示当前代码手动抛出一个异常对象(意味着可以调用对象的方法),下面的代码不再执行

意义:

1.在方法中,若传递的参数有误,没有再运行下去的必要,则采取抛出处理,表示让该方法结束运行

2.告诉调用者方法中出现了问题

psvm{

int[ ] arr = null;

p( arr );}

public static void p(int[ ] a ){

if (arr == null){

//sout(参数不能为null)-------调用者无法判断是打印成功还是报错

throw new NullpointException();-----if参数为null时,手动创建异常,并抛给调用者jvm

}else{

a.fori { sout( a[i] ) }   }

若改成

try{

p(arr)

}catch(NullpointException  e ){

sout(参数不能为null);

}

sout(xxx);---------------使用了trycatch后面的代码能正常运行

trycatch:

常见问题:

1.如果try中没有遇到问题,怎么执行?

try内和try外执行,catch不执行

2.如果try中遇到问题,try下面的代码还会执行吗?

try内,出现问题的语句后的代码都不执行,catch和try外都执行

3.如果出现的问题没有被捕获,那么程序如何运行?

默认交给调用者,即jvm

4.同时出现多个异常怎么处理?

try{

String line = sc.nextline();

int age = Integer. parseInt(line);             ①

sout(age);

sout(2/0);     ②

}catch(NumberFormatException  e ){

sout(格式异常)}

sout(xxx)

情况一:

当①出现问题,会被catch到,try内①后的代码不执行,try外是正常执行

情况二:

当①正确,②出了问题,但未catch到,默认交给调用者处理,即jvm,且try外不执行。

情况二--优化方式:再加多一个catch

}catch(NumberFormatException  e ){

sout(格式异常)

}catch(ArithmeticException  e ){

sout(数学异常)

}

注意:多个catch中有子父类关系,父类必须放在最后,否则全部都被父类接收了

为什么不统一全部用Exception去catch?

以后使用会正对不同的异常,有不同的处理

Throwable的成员方法:

最大的异常,是Exception和Error的父类(意味着方法子类都可以使用)

public String getMessage()返回比throwable的详细消息字符串(错误原因)
public String toString()返回此可抛出的简短描述(异常名+错误原因)
public void printStackTrace()把异常的错误信息输出在控制台(字体为红色)(常用)

注意:public void printStackTrace()

错误信息:异常名+错误原因+位置

虽然效果和报错一样,但是try后的代码仍然可以运行

try{ int[ ] a = {1,2,3}

sout(a[10]);//底层会自动创建 new ArrayIndexOutofBoundsException();然后赋值给e

}catch(ArrayIndexOutofBoundsException e ){

e.printStackTrace();----------再调用e的方法

}

sout(xxx)----------正常执行

domain----Student

方法中

例:setAge(int age){

if(10<age<18){

this.age = age;

}else{

throw new Exception("年龄超范围了");----此处有个疑问:为什么不能直接输出sout,throw的优势再哪里呢?

因为sout可能会被使用到,就比如返回值是int  你返回个-1可能会被使用,也就是所说的 调用者无法判断是否出错  而报异常无需返回值,直接就可以抛异常处理

}}

测试类中:

while(true){

String a = sc.next();

try{

int age = Integer.parseInt(a);

s.setAge(age);-----只要出现问题,break就执行不到

break;

}catch(NumberFormatException  e ){

sout(请输入整数)

continue;

}catch(Exception e){

sout(年龄超范围了)

continue;

}

sout(xxx)

}

自定义异常

目的:为了让异常信息更加见明知意

格式:

类名 extends RuntimeException(常用) / Exception(){

serialCersionUID----后面会讲

空参构造

有参构造(String s)

}

例如:

例:setAge(int age){

if(10<age<18){

this.age = age;

}else{

throw new Exception("年龄超范围了");}

此处的 Exception是一个大类,且容易导致catch到try里的其他同类型的错误

另外,当new Exception("年龄超范围了");

再try catch(Exception  e){

sout(e.toString)  =  异常名+年龄超范围了

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: try catch finally throw throws 是Java中的关键字,用于处理异常try:用于包含可能会抛出异常的代码块。 catch:用于捕获try块中抛出的异常,并进行相应的处理。 finally:无论try块中是否抛出异常,finally块中的代码都会被执行。 throw:用于手动抛出异常throws:用于声明方法可能会抛出的异常类型。 ### 回答2: trycatch、finally、throwthrows都是Java中用于处理异常的关键字。 trytry异常处理语句的开始,用于包裹可能会抛出异常的代码块。在try块中,可以放置可能会出现异常的代码逻辑。 catchcatch用于捕获try块中可能抛出的异常。如果try块中出现了异常,会检查catch块中是否有能够处理该异常的代码块。如果有匹配的catch块,程序会进入该catch块并执行异常处理逻辑。 finally:finally块用于定义无论是否发生异常,都必须执行的代码。即使try块中出现了异常,finally块中的代码仍然会被执行。finally块通常用于资源的释放,例如关闭文件或数据库连接。 throwthrow用于手动抛出异常。可以使用throw关键字在代码中显式地抛出某个具体的异常对象。一旦throw语句执行,程序将立即跳转到最近的catch块进行异常处理。 throws:throws关键字用于声明方法可能抛出的异常列表。在方法的声明中使用throws关键字,表明该方法可能会引发某些异常,调用该方法的代码需要对其进行异常处理或向上一层抛出。如果方法内的异常没有在catch块中处理,那么会根据throws所声明的异常列表传递给该方法的调用者。 总之,try用于尝试执行可能抛出异常的代码块,catch用于捕获和处理异常,finally用于定义无条件执行的代码块,throw用于手动抛出异常throws用于声明方法可能抛出的异常列表。这些关键字的使用可以有效地处理异常,提高程序的鲁棒性和可靠性。 ### 回答3: try catch finally throw throws 是Java中的异常处理机制。 try-catch语句用于捕获并处理异常try块中放置可能产生异常的代码,如果产生异常,则由catch块捕获并处理异常catch块中的代码是用于处理异常的,可以在其中编写特定的逻辑来处理异常情况。 finally块是可选的,用于在try-catch之后执行一段无论是否发生异常都会执行的代码。finally块通常用于释放资源或进行清理操作,确保代码执行完毕后资源得到正确的释放。 throw关键字用于在代码中手动引发异常。通过throw语句,我们可以自定义异常并将其抛出,从而通知调用者发生了错误或特定情况。 throws关键字用于声明方法可能抛出的异常类型。在方法声明中使用throws关键字可以告诉调用者需要处理的可能出现的异常类型以便进行适当的异常处理。 总之,try-catch-finally语句用于处理可能发生的异常throw用于手动引发异常throws用于在方法声明中指定可能抛出的异常类型。异常处理是保证程序健壮性的重要一环,能够更好地应对异常情况,提高代码的可靠性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值