详述throw和throws

为什么会有报错机制呢?,在有报错机制上是为了更好的提醒用户及时的错误信息,在C语言中我们一般在处理可能出现的错误上一个个添加上错误信息,但在java中就不需要了,可以节省调用类的篇幅,在自定义异常类的或者是Java中自己编写的代码中会有丢出报错信息,我们也就可以从一个地方接口Exception中在到子类中来把错误信息找到,异常信息是经过包装好的就可以节省代码优化代码,他们也都是继承于Exception类,通过如Exception类他会自动找到属于那个错误信息,并且能打印出来,也可以专指出那个抛出异常的类,如下面的代码就专写出来MyException类中提示异常信息,哪个环节出现了错误,能及时的提示给用户:这里面的异常也就是类包裹的,把错误封装到异常类中。
异常处理的作用
1、当异常发生时,能够将异常通知给编程人员或者用户。
2、然后使本来已经中断的程序以适当的方式继续运行,或者退出。
并且能够保存用户的当前操作,或者进行数据回稳。
3、最后再把占用的资源释放掉,这里也主要final来对资源占用进行释放。
4,假如你写了个求商的程序,除数和被除数都由用户输入,你能事先知道用户输入什么数吗?如果你没有用异常处理,用户输入的除数不为0就没有问题,除数为0程序就会崩溃了;用了异常处理可以在用户输入除数为0时警告用户并要求他改正输入,这难道不是很好吗?

比如说你的程序需要读取某个文件 或者需要连接网络 又或者使用数据库这样的情况,虽然程序是你写的 但是你绝对不能保证文件一定存在网络一定畅通 数据库一定会打开,三个同时都成功这个程序才能运行,(当你没有联网时,登陆QQ是不是要报错,这其实就是异常处理啊(假设QQ使用JAVA写的),但是此时程序是没有问题的。你只要连上网就可以使用了,不用再次加载程序了,但没有就会程序直接结束,还得从新点开QQ登录)当其中的一个有个异常这个时候就会在准确的地方告诉你哪个地方有问题,你也就可以直接手动去更根据提示去解决,这个时候为了程序能继续运行, 把上边说的不能使码正常运行的情况解释成异常 ,要想运行就必须这些处理异常。在一个try中一般在创建对象的方法中就会throw丢出异常信息来进行对自己方法要求的判断,提示信息和方便错误输出的修改,这个时候就得要有接受者,那当然会把异常自动给调用这个方法的使用者去验证去了,try就是接受者这个符号会让java机制会调用检查机构,他会接受这些异常信息,并会读取这些异常信息所需要的条件,看看代码中所要求的条件是否符合正确的要求,符合的话就把异常信息给自行消化掉,正确的运行代码,否则就会在MyException中找到相应的出现异常的子类,并且打印出来精准异常地点,当然这里也可以不接受异常的,通过throws继续往上面抛出去,最中抛给JVM,他在检查异常判断代码编写书否符合要求,如果有异常的也会显示异常信息。但注意jvm检查异常的信息的时候会结束程序,而try catch就不会结束程序只会结束try catch中的代码运行,其他以外没有异常的信息也可以运行的。方法用throw丢出去的异常也就是为了让调用这个方法所要求的条件是正确的,让检查机制去检查代码去
程序运行中出现异常就会终止程序。而我们可以通过捕获异常,使异常后面的程序正常运行。例如你写个程序读取文件,但是读到一半出错了。如果你不处理异常,那就会连后面的程序也不运行了。如果我们处理了异常,就让异常后面的程序段正常运行。例如关闭文件,释放资源。
也可以参考一下这个:https://blog.csdn.net/u011541946/article/details/80721671

FileChannel inputChannel=null; 	
			FileChannel outpChannel=null;
		try {			
			fileInputStream=new FileInputStream("C:\\a.txt");
		    inputChannel =fileInputStream.getChannel();
			FileOutputStream fileOutputStream=new FileOutputStream("D:\\q.txt");
			outpChannel=fileOutputStream.getChannel();
			System.out.println("hhhhhhhhhhh");
			ByteBuffer buByteBuffer=ByteBuffer.allocate(1024);
			while(inputChannel.read(buByteBuffer)!=-1) {
				buByteBuffer.flip();//重新把position放到0
				outpChannel.write(buByteBuffer);
				buByteBuffer.clear();//并没有把原来的数据给清除掉,只是就认为是覆盖吧。
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(inputChannel!=null) {
				try {
					inputChannel.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}		
			}
		}		
		ByteBuffer byteBuffer =ByteBuffer.allocate(2014);
		byte a=1;
		byte b=2;
		byte c=3;
		byte d=4;
		byte e=5;
		byteBuffer.put(a);
		byteBuffer.put(b);
		byteBuffer.put(c);
		byteBuffer.put(e);
		byteBuffer.flip();
//		System.out.println(byteBuffer.position());	
		byteBuffer.put(d);
//		byteBuffer.flip();
		System.out.println(byteBuffer.position());
//		byteBuffer.clear();
		for(int i=0; i<6;i++)
		{
			System.out.println(byteBuffer.get());
		}

结果为可以看出没影响下面的代码运行:
在这里插入图片描述
jvm的运行机制为:
jvm捕获异常
在编译生成的字节码中,每个方法都会有一个异常表。异常表的每一条都代表一个异常处理器,都是这个类中所有异常信息,而非有异常的异常信息。有from指针,to指针、target指针和锁捕获的异常类型构成。这下指针的值是字节码索引bci,用来定位字节码。from和to指针标示了异常处理器要监控的范围,即try代码块的内容。target指针则是catch代码块的起始位置。当发生异常时,jvm会从上至下遍历所有的数据,当触发异常的字节码索引在某个from-to范围内,jvm就会判断抛出异常的类型和该条要捕获的异常的类型匹配的时候,jvm的控制流就会转向该catch块的字节码。如果遍历完之后还没找到对应的类型,jvm就会沿着调用栈向上执行同样的操作。在最坏的情况下,jvm会遍历这个调用栈的每一个调用者。
而对于finally块,jvm是把这个finally块的字节码复制到 try-catch块的所有正常退出,异常退出的出口那,之后就结束程序运行。

tyr{
//可能的异常1
//可能的异常2
//可能的异常3
//可能的异常4
//可能的异常5
//可能的异常6
//可能的异常7
.......
//可能的异常n
}
catch(Exception e){
//统一处理
}
异常处理机制的方便
例如c语言 中有n个可能异常
if(可能的异常1)then .....
if(可能的异常2)then .....
if(可能的异常3)then .....
......
if(可能的异常n)then .....
两个一比较就知道异常处理机制好在那儿了!

一:自定义异常类:

//或者继承RuntimeException(运行时异常)
public class MyException extends Exception { 
 
  private static final long serialVersionUID = 1L; 
 
  // 提供无参数的构造方法
  public MyException() { 
  } 
 
  // 提供一个有参数的构造方法,可自动生成
  public MyException(String message) { 
    super(message);// 把参数传递给Throwable的带String参数的构造方法 
  }  
} 

二:写一个测试分数的方法类:这里面是抛出一个自己写的异常类

public class CheckScore { 
 
  // 检查分数合法性的方法check() 如果定义的是运行时异常就不用抛异常了 
  public void check(int score) throws MyException {// 抛出自己的异常类 
    if (score > 120 || score < 0) { 
      // 分数不合法时抛出异常 
      throw new MyException("分数不合法,分数应该是0--120之间");// new一个自己的异常类 
    } else { 
      System.out.println("分数合法,你的分数是" + score); 
    } 
  } 
} 

三:写一个测试分数,如果有异常,要捕获,不要抛出了

import java.util.Scanner; 
 
/* 
 * 自定义的异常测试类 
 */ 
public class Student { 
  public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int score = sc.nextInt(); 
 
    CheckScore check = new CheckScore(); 
    try { 
      check.check(score); 
    } catch (MyException e) {// 用自己的异常类来捕获异常 
      e.printStackTrace(); 
    } 
  } 
 
} 
原文链接:https://blog.csdn.net/peanutwzk/article/details/78934392

提示:

在封装中会设置自己定义的变量范围来限制使用者的范围权限,往往会在超出范围时给使用者提示。
其中的throw new NullPointerException(“年龄无效”);就是输出信息,和抛出异常对象,在try中就是抛给try-catch进行处理。单个独立出现就是抛给调用者解决。
其中的e.printStackTrace();只是为了打印出来异常的地方可以点击快速找到。
在try中只要能在找到一处格式或者不符合原方法要求的错误的时候就开始往catch中走,在Exception e通过所有有问题的语句,在接着显示出有问题的地方。
在这里插入图片描述
// public int age;//如果该变量为public级别的变量,则定义Student类的人无法对该变量的范围进行有效的约束 公共方法操作私有属性
private int age;
// public void setAge( int age) {
// if (age>1 && age<20) {
// this.age = age;
// }else {
// //System.out.println(“年龄无效”);
//思考:这种提示错误的方式对于调用该方法的程序员没有什么过多的直接的帮助,解决方案:throw 异常对象
// //throw new NullPointerException(“年龄无效”);
//思考:词不达意 String str=null;str.length()
// throw new AgeException(“年龄无效”);//如何自定义异常:创建继承Exception 或其子类的自定义类;自定义异常类调用父类构造函数(通常是含有一个String类型参数的构造函数);
// }
// }
在这里插入图片描述
点击下面的Student.java:12会出现异常出现的地点直接显示出现的异常就会显示跳转到异常出。
在这里插入图片描述
在提醒使用者警示警告的时候可以自定义自己的显示类,
在scr中重新建立一个包,并用自己的写的自定义的异常类去继承原来Exception中子类。
在这里插入图片描述
在这里插入图片描述

package com.jd.exception;

public class AgeException extends RuntimeException{
private static final long serialVersionUID = -1829894057306300522L;
public AgeException(String message) {
super(message);
}
}
在这里插入图片描述
在这里插入图片描述

在运行时异常
在这里插入图片描述
在运行异常中,是在本异常中抛给自己解决的,若没有自己解决会在调用该方法的对象在自己的类中也没有解决,会在该对象创建的方法中会有个隐式的throws在直接抛给Jvm。
如下在出现的错误中在Setage()中throw了一个运行时的错误,给调用setAge的对象,在类Text中Student对象对调用的方法丢出来的运行时错误没有解决,在运行时异常中会在最终的方法后有个隐式throws如在main后有一个隐式的throws最中把错误丢给JVM。
在这里插入图片描述
在这里插入图片描述
在检查式异常中必须明确解决的地方 ,如在下列中就在出现检查式异常中就自己解决了,明确是自己解决的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
a,在下面中加入了throws,在出现检查时异常的方法外加入的这也明确了时把这个检查式异常给调用这个方法的对象,自己不解决。
在这里插入图片描述
b,当在调用他的对象也要明确是自己解决还是上丢,下面是自己解决的例子
在这里插入图片描述
c,下面最终是上丢给大boss就是JVM了。
在这里插入图片描述
throw用于抛出异常对象,下面详解throw和throws;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1、如果异常对象为运行时,则方法参数列表后面可以不是使用throws,也可以将异常抛给方法调用者;try-catch。
2、如果异常对象为检查时,则方法参数列表后面须使用throws抛出创建该对象的类;或如果没有uthrows 必须try-cacth来进行解决问题
throw与throws的区别:
抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;
使用位置不同:
1,throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必须使用try-catch自行处理;
2,throws只能用在方法声明括号后面;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值