首页 > 编程语言 >java处理异常这一篇就够了

java处理异常这一篇就够了

时间:2023-02-18 19:00:46浏览次数:38  
标签:java 一篇 System 就够 Scanner println public out

java 异常

package com.text01;

import java.util.Scanner;

public class Text {
public static void main(String[] args) {
//实现一个功能:
//键盘录入俩个数,求商
Scanner scanner = new Scanner(System.in);
System.out.println("cin one:");
int num1 = scanner.nextInt();
System.out.println("cin two:");
int num2 = scanner.nextInt();
System.out.println("s = "+num1/num2);

//测试过程中发现问题
}
}

第一行提示异常的类型,最后一行提示异常出现的位置

java处理异常这一篇就够了_java

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at com.text01.Text.main(Text.java:13)
//输入不匹配异常


java.util.InputMismatchException//输入不匹配
at com.text01.Text.main(Text.java:13)//在第13行出现

java处理异常这一篇就够了_java_02

Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.text01.Text.main(Text.java:14)
//算术异常

异常:Exception:在程序的运行过程中,发生了不正常的现象,称之为异常

处理异常

if - else

package com.text01;

import java.util.Scanner;

public class Text {
public static void main(String[] args) {
//实现一个功能:
//键盘录入俩个数,求商
Scanner scanner = new Scanner(System.in);
System.out.println("cin one:");
int num1 = scanner.nextInt();
System.out.println("cin two:");
int num2 = scanner.nextInt();
if(num2 == 0){
System.out.println("sorry,num is not 0");
}else {
System.out.println("s = " + num1 / num2);
}
//测试过程中发现问题
}
}

缺点:

  1. 业务代码和处理异常的代码混在一起
  2. 可读性差
  3. 需要花费大量的精力来维护漏洞
  4. 很难堵住所有的漏洞

try...catch

java处理异常这一篇就够了_System_03

package com.text01;

import java.util.Scanner;

public class Text02 {
public static void main(String[] args) {
//实现一个功能:
//键盘录入俩个数,求商
try {
Scanner scanner = new Scanner(System.in);
System.out.println("cin one:");
int num1 = scanner.nextInt();
System.out.println("cin two:");
int num2 = scanner.nextInt();
System.out.println("s = " + num1 / num2);
}catch (Exception ex){
System.out.println("break down");
}

}
}

java处理异常这一篇就够了_java_04

异常捕获后,不影响程序的下一步执行!

原理:

把可能出现异常的代码放入try代码块中,然后将异常封装为对象,被catch后面的()中的那个异常对象接收,接收后,:执行catch后面的{}代码,然后try-catch后面的代码该怎么执行怎么执行

Exception:属于异常的父类,故可以用Exception来接收异常,当异常不匹配的时候,即使出现异常,catch{}中的代码也不会执行

catch如何处理异常?

package com.text01;

import java.util.Scanner;

public class text03 {
public static void main(String[] args) {
//实现一个功能:
//键盘录入俩个数,求商
try {
Scanner scanner = new Scanner(System.in);
System.out.println("cin one:");
int num1 = scanner.nextInt();
System.out.println("cin two:");
int num2 = scanner.nextInt();
System.out.println("s = " + num1 / num2);
}catch (Exception ex){
//1.什么都不写
//2.
//System.out.println("break down");

//3.打印异常信息
System.out.println(ex);
System.out.println(ex.toString());
System.out.println(ex.getMessage());
ex.printStackTrace();//将异常信息捕获后,在控制台展示出来,用的最多

//4.抛出异常
throw ex;
//捕获后重新把异常抛出去,后面的代码也不再执行
}
System.out.println("hh");
}
}

java处理异常这一篇就够了_System_05

finally

在什么情况下catch后面的代码不执行?

  1. throw ex抛出异常的时候,后面的代码就不再执行
  2. catch中没有正常的进行异常捕获
  3. 在catch中遇到return

那么咋样让try-catch后面的代码,必须执行?

只要将必须执行的代码放入finally中,那么这个代码无论如何一定执行

package com.text01;

import java.util.Scanner;

public class text04 {
public static void main(String[] args) {
//实现一个功能:
//键盘录入俩个数,求商
try {
Scanner scanner = new Scanner(System.in);
System.out.println("cin one:");
int num1 = scanner.nextInt();
System.out.println("cin two:");
int num2 = scanner.nextInt();
} catch (Exception ex) {
throw ex;
} finally {
System.out.println("hh");
}
}
}

java处理异常这一篇就够了_ci_06

假如出现return:

先执行finally中的代码最后执行return

什么代码放在finally中?

  1. 关闭数据库资源
  2. 关闭IO流资源
  3. 关闭socket资源……

只有程序强制退出,能让finally不执行。

​System.exit(1);​

多重catch

package com.text01;

import java.util.InputMismatchException;
import java.util.Scanner;

public class text04 {
public static void main(String[] args) {
//实现一个功能:
//键盘录入俩个数,求商
try {
Scanner scanner = new Scanner(System.in);
System.out.println("cin one:");
int num1 = scanner.nextInt();
System.out.println("cin two:");
int num2 = scanner.nextInt();
} catch (InputMismatchException ex) {
System.out.println("Input is not Int");
} catch (ArithmeticException ex) {
System.out.println("The divisor cannot be empty");
} finally {
System.out.println("hh");
}
}
}

针对不同的异常,输出不同的语句,比较顺序为:依次比对,在安排顺序的时候,我们一般先将小范围的先在前面,大范围的写在后面,即子类在前,父类在后。

异常的分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnGQ72if-1667472517584)(D:\图片\image-20221103165921005.png)]

我们的重点在Exception,因为Error异常我们一般是无法解决的。程序中的语法错误,逻辑错误,不属于上面的Error,Exception

package com.text01;

public class Text05 {
public static void main(String[] args) {
//运行时异常
int[] arr = {1,2,3};
System.out.println(arr.length);
int[] arr1 = null;
System.out.println(arr1.length);
//空指针异常
}
}

java处理异常这一篇就够了_System_07

属于运行时异常

package com.text01;

public class Text06 {
public static void main(String[] args) {
//检查异常
Class.forName("com.text01.Text");
}
}

java处理异常这一篇就够了_java_08

起到一个防患于未然的效果,在写代码的时候就要对代码的异常进行处理

属于检查时异常

throw和throws

共同点

两者在抛出异常时,抛出异常的方法并不负责处理,顾名思义,只管抛出,由调用者负责处理。

区别

(1)throws用于方法头,表示的只是异常的申明,而throw用于方法内部,抛出的是异常对象​。

java处理异常这一篇就够了_java_09

(2)throws可以一次性抛出多个异常,而throw只能一个(3)throws抛出异常时,它的上级(调用者)也要申明抛出异常或者捕获,不然编译报错。而throw的话,可以不申明或不捕获(这是非常不负责任的方式)但编译器不会报错。

重载和重写的区别

重载:在同一个类中,当方法名相同,形参列表不同的时候,多个方法构成了重载

重写:在不同的类中,子类对父类提供的方法不满意的时候,要对父类的方法进行重写

java处理异常这一篇就够了_ci_10

package com.text01;

public class Demo {
public void a() throws Exception{

}
public void a(int age) throws ArithmeticException{

}
}
package com.text01;

public class ddmo {
public class Person{
public void eat() throws RuntimeException{
System.out.println("父类方法");
}
}
public class Student extends Person{
@Override
public void eat() throws RuntimeException {
System.out.println("子类方法");
}
}

}

子类<=父类

标签:java,一篇,System,就够,Scanner,println,public,out
From: https://blog.51cto.com/u_15558498/6065507

相关文章

  • 学习java周记
    ​个人感想    第一感觉就是学习很吃力,刚开始第一周接触的是HTMl,很多东西并不能很好的理解,主要是对英语单词不明白意思,哪怕是很基础的也需要进行翻译花费不少时间。......
  • 类Unix系统下Java使用JNI调用类C方法
    https://github.com/moocstudent/java-jni-unixlike-test通过切换到java目录执行javac-h./JniSample.java编译源文件并生成head文件JniSample.h在类UNIX系统下,使......
  • java中取模的本质,即%的运算结果
    Java中%的本质如下公式:m%n=m-(int)(m/n)*n且看例题已知a=2,b=3,则表达式a%b*4%b的值为(2)运用公式得知:a%b=2%3=2-(0)3=2其中2/3=0.666666,取整数为04......
  • 三种循环的比较 do...for...while... java 230218
    需求输出0-9publicclassTest9{publicstaticvoidmain(String[]args){//输出0到9//for.i+tabfor(inti=0;i<10;i++){......
  • PAT-basic-1020 月饼 java
    一、题目月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大......
  • Java中的长度length、length()、size()的区别
    java中有三个常用的与长度相关的属性和方法,分别是length、length()、size()。记录一下它们之间的区别;length属性单独的length是针对数组而言,表示声明数组的长度,也就是......
  • 无限循环与游戏循环 java 230218
    循环次数没有上限的循环示例while(true){System.out.println("打游戏");}游戏循环游戏里基本都是无限循环用户可以在适当的时机选择退出这个无限循环importjava.util......
  • 微软出品自动化神器【Playwright+Java】系列(九)多线程、重定向、弹出新窗口、截图、新
    写在前面关于Playwright系列的文章,真的很久没有写了,今天一个不小心官方API部分过完了,下面将为大家逐一演示,感兴趣的同学可以自行动手练习。API部分多线程直白点说就是......
  • 高CPU Java应用分析
    模拟CPU40%左右importjava.util.concurrent.CountDownLatch;publicclassMainextendsThread{privateCountDownLatchc;publicMain(Stringname,Cou......
  • PAT-basic-1016 部分A+B java
    一、题目正整数 A 的“DA​(为1位整数)部分”定义为由 A 中所有 DA​ 组成的新整数 PA​。例如:给定 A=3862767,DA​=6,则 A 的“6部分”PA​ 是66,因为 A 中......