当前位置: 代码迷 >> 综合 >> Day15 异常 Throwable
  详细解决方案

Day15 异常 Throwable

热度:53   发布时间:2024-02-09 02:51:39.0

异常 Throwable

所有异常类的根类

error

错误,不能被处理,因为是系统内部的错误,运行报错,系统问题

  • 内存溢出
  • 系统崩溃

Exception

编译期异常,编码中出现的,根据问题描述可以处理的

  • RuntimeException运行期异常,运行过程出现的问题
//例如
package java15;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Exception {public static void main(String[] args) /*throws ParseException*/ {
// SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
// Date date = null;
// try {
// date = sdf.parse("2000-1103");
// } catch (ParseException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } 
// System.out.println(date);
// System.out.println("后续方法");
// /*
// * 解决异常方法
// * throws ParseException 抛出异常,有错误直接输出异常 后续代码不实现
// * 第二种,后续方法可实现
// *///运行期异常 //也可以用Try catch处理 快捷键 shift+alt+z 
// int[] arr= {1,2,3};
// System.out.println(arr[0]);
// try {
// System.out.println(arr[3]);
// } catch (java.lang.Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// 
// System.out.println("后续代码"); }}

异常的处理

try , catch , finally , throw , throws

throw关键字

package java15;public class ThrowMain {/*在指定方法抛出指定异常格式throw new xxxException(“产生原因”);注必须写在方法内部方法对象必须是Exception或他的子类throw抛出异常,必须处理这个异常throw关键字后面创建的是运行异常,可以不处理创建的是编译异常,必须处理,try,throw*/public static void main(String[] args) {//method(null, 0);int[] arr= {1,2,3};method(arr, 3);}private static int method(int[] arr,int index) {//对传递的参数合法性校验//空指针异常if(arr==null) {throw new NullPointerException("传递的是空");}//数组越界异常if(index < 0 || index >arr.length-1 ) {throw new ArrayIndexOutOfBoundsException("数组索引越界");}int x=arr[index];return x;	}}

Objects静态方法

requireNonNull方法

import java.util.Objects;public class ObjectMain {public static void main(String[] args) {method(null);}private static void method(Object obj) {//自己书写代码合理性判断 
// if(obj==null) {
// throw new NullPointerException("空指针异常");
// }//使用方法自行判断// Objects.requireNonNull(obj);Objects.requireNonNull(obj, "空指针异常");}}

异常处理1----throws

package java15;import java.io.FileNotFoundException;
import java.io.IOException;public class ThrowsMain {/** 异常处理的第一种方法* 会把异常对象声明抛出给方法调用者处理,自己不处理,给别人处理,JVM处理* 格式* 修饰符 返回值类型 方法名(参数列表) throws{* throw new AAAException(“产生原因”);* ...* }* * 注意:* throws关键字必须写在方法声明处* throws关键字后面声明的异常必须是Exception,或者是Exception的子类* 方法内部如果抛出了多个异常对象,那么throws垢面必须声明多个异常* 如果抛出的多个异常对象有字父类关系,那么直接声明父类异常* 调用一个声明抛出异常的方法,必须处理声明的异常* throws/try catch* */public static void main(String[] args) throws FileNotFoundException,IOException {	//调用一个声明抛出异常的方法,必须处理声明的异常method1("c:\\a.tx");	System.out.println("后续代码");	//后续代码不执行}private static void method1(String FileName) throws FileNotFoundException,IOException {if(!FileName.equals("c:\\a.txt")) {throw new FileNotFoundException("传递路径错误");}/** 如果后缀名不对 * */if(!FileName.endsWith(".txt")) {throw new IOException("后缀命错误");}System.out.println("路径正确,读取文件中.......");}}

异常处理2----try catch

package java15;import java.io.FileNotFoundException;
import java.io.IOException;public class TryCatchMain {/** 自己处理异常* try{* 可能产生的异常代码* }catch(定义一个异常变量,接受try抛出异常对象){* 异常的处理逻辑,,异常对象之后,怎么处理异常对象* 一般把异常的信息记录到日志中* }* ...* catch(异常类名 变量名){* }* * 注意:* 1.try种抛出多个异常,可以使用多个catch来处理这些异常对象* 2.如果try种产生了异常,那么会执行catch中的异常处理逻辑,处理完后继续执行后续代码如果没产生异常,就不会执行catch*/public static void main(String[] args) {try {method1("abc");System.out.println("后续代码");//不执行} catch (IOException e) {// try抛出异常的接受System.out.println("后缀命错误");}System.out.println("后续代码");//执行}private static void method1(String FileName) throws FileNotFoundException,IOException {if(!FileName.equals("c:\\a.txt")) {throw new FileNotFoundException("传递路径错误");}/** 如果后缀名不对 * */if(!FileName.endsWith(".txt")) {throw new IOException("后缀命错误");}System.out.println("路径正确,读取文件中.......");}}

Finally代码块----try catch中

  • try catch 的 try 中后续代码不实现,需要实现的话,放在finally代码块里面
  • 必须和try catch一起使用
  • 一般用于资源回收(释放)
  • 如果finally中有return语句,返回的是finally中的结果 因为finally语句必须执行
package java15;import java.io.FileNotFoundException;
import java.io.IOException;public class FinallyMain {public static void main(String[] args) {try {method1("c:\\a.tx");} catch (IOException e) {System.out.println("后缀名错误1");}finally {//无论是否出现异常,都执行 System.out.println("资源释放");}}private static void method1(String FileName) throws FileNotFoundException,IOException {if(!FileName.endsWith(".txt")) {throw new IOException();}System.out.println("路径正确,读取文件中.......");}
}

Throwable的3个异常处理方法

代码借用上方

	public static void main(String[] args) {try {method1("c:\\a.tx");} catch (IOException e) {// try抛出异常的接受System.out.println("传递路径错误"); System.out.println(e.getMessage()); // 壹:传递路径错误---简短的描述System.out.println(e.toString()); //贰:java.io.FileNotFoundException: 传递路径错误e.printStackTrace();/*叁:最全面的信息* java.io.FileNotFoundException: 传递路径错误at java15.TryCatchMain.method1(TryCatchMain.java:40)at java15.TryCatchMain.main(TryCatchMain.java:26)*/}

异常处理注意事项

多异常捕获处理

  • 异常依次捕获,依次处理,一个try 对应一个catch
  • 异常一次捕获,依次处理,一个try 对应多个catch
    注意:catch里定义的异常变量,如果有字符类关系,子类写在父类上方
  • 一次捕获一次处理

子父类异常

父类异常什么样子,子类异常也是什么样子
父类抛出多个异常,子类抛出和父类一样的异常,或者父类抛出的子类或不抛出
父类不抛出异常,子类也不,若此时子类有异常,只能捕获,不能声明抛出

自定义异常

格式:
public class XxxException extends Exception 、RunTimeException{ 添加一个空参构造, 添加一个带异常信息的构造}
注意:
命名一般以Exception结尾
自定义异常类,必须继承Exception(编译期异常)和RunTimeException(运行期异常 )

//自定义异常类
package java15;/** 自定义异常类*/
public class RegisterException extends Exception{public RegisterException() {// 空参构造方法super();}public RegisterException(String s) {//带异常信息 super(s);}}

主方法


package java15;import java.util.Scanner;public class Case {
/** 自定义异常的练习*/static String[] arr= {"张三","李四","王五","赵六"};	//得到初始数据public static void main(String[] args) throws RegisterException {//Scanner得到数据Scanner sc=new Scanner(System.in);System.out.println("请输入用户名");String next = sc.next();checkarr(next);}/** 判断用户名*/private static void checkarr(String str) throws RegisterException {for(String s : arr) {if(s.equals(str)) {throw new RegisterException("该用户被注册");}}System.out.println("注册成功");}}
  相关解决方案