Java中异常的两种处理方式

异常处理的两种方式:

  1. 声明抛出 throws  声明抛出的位置:是在方法声明的位置上使用throws关键字向上抛出异常。
  2. 捕捉 try....catch..
public class ExceptionTest03{

    public static void main(String[] args){
    //创建文件输入流读取文件
    //思考:java编译器是如何知道以下的代码执行过程中可能出现异常,
    //java编译器是如何知道这个异常发生的几率比较高呢?
   //java编译器不是那么智能,因为FileInputStream这个构造方法在声明的位置上使用了throws FileNotFoundException;
        FileInputStream fis=new FileInputStream("c:/ab.txt");
        
    }
}

//以上程序编译不通过
/*
ExceptionTest03.java:16: 未报告的异常 java.io.FileNotFoundException;必须对其进行捕捉或声明以便抛出 FileInputStream fis = new FileInputStream("c:/ab.txt");
*/

深入了解throws关键字

public class ExceptionTest04{

	public static void main(String[] args) throws FileNotFoundException{

		//m1();
		//使用throws处理异常不是真正处理异常而是推卸责任。
		//谁调用的就会抛给谁。
		//上面的m1方法如果出现了异常,因为采用的是上抛,给了JVM,JVM遇到这个异常就会退出JVM,下面的这个代码不会执行.
		//System.out.println("Hello World");

		//真正处理
		try{
			m1();
		}catch(FileNotFoundException e){}

		System.out.println("Hello World");
	}

	public static void m1() throws FileNotFoundException{
		m2();
	}

	public static void m2() throws FileNotFoundException{
		m3();
	}

	public static void m3() throws FileNotFoundException{
		new FileInputStream("c:/ab.txt"); //FileInputStream构造方法声明位置上使用throws(向上抛)
	}

}

/*
//在程序运行过程中发生了FileNotFoundException类型的异常.
//JVM为我们创建了一个FileNotFoundException类型的对象。
//该对象中携带以下的信息。
//JVM负责将该对象的信息打印到控制台。
//并且JVM停掉了程序的运行。
Exception in thread "main" java.io.FileNotFoundException: c:\ab.txt (系统找不到指定的文件。)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at ExceptionTest04.m3(ExceptionTest04.java:31)
        at ExceptionTest04.m2(ExceptionTest04.java:26)
        at ExceptionTest04.m1(ExceptionTest04.java:21)
        at ExceptionTest04.main(ExceptionTest04.java:11)
*/

try...catch..

语法:

try{

可能出现异常的代码;

}catch(异常类型1 变量){

处理异常的代码;

}catch(异常类型2 变量){

处理异常的代码;

}....

1.catch语句块可以写多个.

2.但是从上到下catch,必须从小类型异常到大类型异常进行捕捉。

3.try...catch...中最多执行1个catch语句块。执行结束之后try...catch...就结束了。

public class ExceptionTest05{

	public static void main(String[] args){

		//以下代码编译无法通过,因为FileNotFoundException没有处理.
		/*
		try{

			//FileNotFoundException
			FileInputStream fis = new FileInputStream("c:/ab.txt");

		}catch(ArithmeticException e){ //捕获的异常是算术异常
		}
		*/

		//编译通过
		/*
		try{

			//FileNotFoundException
			FileInputStream fis = new FileInputStream("c:/ab.txt");

		}catch(FileNotFoundException e){

		}
		*/

		//以下程序编译无法通过
		//因为还有更多IOException没有处理.
		/*
		try{

			//FileNotFoundException
			FileInputStream fis = new FileInputStream("c:/ab.txt");

			fis.read();

		}catch(FileNotFoundException e){ 

		}
		*/

		//编译可以通过
		/*
		try{

			//FileNotFoundException
			FileInputStream fis = new FileInputStream("c:/ab.txt");

			fis.read();

		}catch(FileNotFoundException e){ 

		}catch(IOException e){

		}
		*/

		//编译通过.
		/*
		try{

			FileInputStream fis = new FileInputStream("c:/ab.txt");

			fis.read();

		}catch(IOException e){

		}
		*/

		//编译无法通过
		//catch可以写多个,但是必须从上到下,从小到大捕捉。
		/*
		try{

			FileInputStream fis = new FileInputStream("c:/ab.txt");

			fis.read();

		}catch(IOException e){

		}catch(FileNotFoundException e){

		}
		*/
	}
	
public class ExceptionTest06{

	//编译无法通过. 
	//IOException没有处理
	/*
	public static void main(String[] args) throws FileNotFoundException{

		FileInputStream fis = new FileInputStream("abc");
		fis.read();

	}
	*/

	//通过
	/*
	public static void main(String[] args) throws FileNotFoundException,IOException{

		FileInputStream fis = new FileInputStream("abc");
		fis.read();

	}
	*/

	//通过
	/*
	public static void main(String[] args) throws IOException{

		FileInputStream fis = new FileInputStream("abc");
		fis.read();

	}
	*/

	public static void main(String[] args){

		try{

			//程序执行到此处发生了FileNotFoundException类型的异常.
			//JVM会自动创建一个FileNotFoundException类型的对象,将该对象的内存地址赋值给catch语句块中的e变量.
			FileInputStream fis = new FileInputStream("abc");

			//上面的代码出现了异常,try语句块的代码不再继续执行,直接进入catch语句块中执行。
			System.out.println("TTTTTTT");

			fis.read();

		}catch(FileNotFoundException e){ //e内存地址指向堆中的那个对象是“FileNotFoundException类型的”事件。

			System.out.println("读取的文件不存在!");

			//FileNotFoundException将Object中的toString方法重写。
			System.out.println(e); //java.io.FileNotFoundException: abc (系统找不到指定的文件。)

		}catch(IOException e){

			System.out.println("其他IO异常!");

		}

		System.out.println("ABC");

	}

}
时间: 2024-08-26 00:59:16

Java中异常的两种处理方式的相关文章

细说java中Map的两种迭代方式

以前对java中迭代方式总是迷迷糊糊的,今天总算弄懂了,特意的总结了一下,基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代访问)Collection集合中的元素,Iterator也称为迭代器.它仅仅只有三个方法:hasNext(),next()和remove() hasNext():如果仍有元素可以迭代,则返回 true.(换句话说,如果 next 返回了元素而不是 抛出异常,则返回 true). next():返回迭代的下一个元素. re

Java中String的两种赋值方式的区别

本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过"字面量"赋值,如:String str="hello",第二种是通过new关键字创建新对象,如:String str=new String("hello").那么这两种赋值的方式到底有什么区别呢,下面给出具体分析. 1.首先回顾Java虚拟机的结构图. 在上面的

java中线程的两种创建方式

第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * 6 * @author lzj 7 * 8 */ 9 public class RabbitThread extends Thread { 10 @Override 11 public void run() { 12 for (int i = 1; i <= 100; i++) { 13 Syste

java中多线程的两种创建方式

一丶继承Thread类实现多线程 第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类的对象 , 调用start()方法启动. //线程创建方式一 : /* 第一步:继承Thread类 第二步:重写run()方法 第三步:创建继承了Thread类的对象 , 调用start()方法启动. */ public class TestThread extends Thread{ @Override public void run() { for (int i = 0; i

简述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

java中super 的两种用法

通过用 static 来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于 C 语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的. 好了,现在开始讨论 this&super 这两个关键字的意义和用法. 在 Java 中, this 通常指当前对象, super 则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用

Springboot中IDE支持两种打包方式,即jar包和war包

Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war    在项目的根目录执行maven 命令clean package -Dmaven.test.skip=true,即可打包,如下 命令执行成功后,在target目录下即可看到打包好的文件 提示:若打的包为jar包,可通过java -jar guns-xxx.jar来启动Guns系统 原文地址:https://www.cnblogs.com/mracale

java中线程分两种,守护线程和用户线程。

java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性,默认为用户线程. 区别:主线程结束后用户线程会继续运行,JVM存活:主线程结束后,如果没有用户线程,都是守护线程,则JVM结束. public class Mytest extends Thread { public void run() { for(int i=0;;i++){ try { Th