博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
07异常处理
阅读量:5149 次
发布时间:2019-06-13

本文共 3017 字,大约阅读时间需要 10 分钟。

1、 【请尝试解释以下奇怪的现象!】

 int i=1, j=0, k;

 k=i/j;

 代码在运行时

会引发异常

上边代码在运行时

不会引发异常

 浮点数除以0:Infinity

可以使用javap去反汇编两个示例程序的.class文件(一个是AboutException.class,另一个是ThrowDemo.class),从中你会有所发现的。

 javac 生成 idiv字节码指令

javac 生成ddiv字节码指令

jvm在处理浮点数时,生成的是ddiv字节码指令,i/0,0转化为浮点数0.0,而0.0是double类型的,并不精确,所以不会抛出异常。

jvm在处理整数时,生成的是idiv字节码指令,整数除0就是除0,会抛出异常。

JVM在具体实现这两个指

令时,采用了不同的处理
策略,导致两段代码运行
时得到不同的结果

2、【动手动脑:多层的异常捕获-1】

 阅读以下代码(CatchWho.java),写出程序运行结果:

运行结果:

3、【动手动脑:多层的异常捕获-2】

 写出CatchWho2.java程序运行的结果

运行结果:

4、【动手动脑】

当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。

请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。
特别注意:
当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

源代码:

public class EmbededFinally {

   

 public static void main(String args[]) {
       
  int result;
       
  try {
           
   System.out.println("in Level 1");

          

    try {
               
    System.out.println("in Level 2");
  // result=100/0;  //Level 2
              
     try {
                  
      System.out.println("in Level 3");
                     
      result=100/0;  //Level 3
               
    }
               
    catch (Exception e) {
                   
     System.out.println("Level 3:" + e.getClass().toString());
               
    }
               
               
    finally {
                   
     System.out.println("In Level 3 finally");
               
    }
               
              
    // result=100/0;  //Level 2

           

    }
           
   catch (Exception e) {
              
     System.out.println("Level 2:" + e.getClass().toString());
          
    }
    finally {
               
    System.out.println("In Level 2 finally");
          
    }
            
   // result = 100 / 0;  //level 1
       
  }
       
  catch (Exception e) {
           
   System.out.println("Level 1:" + e.getClass().toString());
       
  }
       
  finally {
          
.    System.out.println("In Level 1 finally");
       
  }
   
 }

}

测试结果:

 

总结try catch finally

1)try抛出一个异常之后,程序会跳出try,不再执行try后边的语句,开始对catch进行匹配,处理异常;

2)try嵌套中,抛出的异常只有被处理才可以按顺序抛出下一个异常,如果不处理,程序就终止;

3)try抛出异常之后,就跳出了try语句,内层catch无法捕获就继续向外抛,所以外层也就有异常,外层语句不执行,第二个程序 throw  new ArithmeticExcepption没有执行。

4)第三个程序,try第一层第二层没有异常不用捕获,执行完之后到第三层,除0有异常,catch捕获,执行第三层的finally然后,顺序执行第二层,第一层的finally。

总结try catch finally嵌套使用执行顺序

1)try语句嵌套从外层到内层执行,在try语句中,哪一层出错,哪一层就抛出异常,后边的try语句就不再执行,如果该层存在catch就进行相应的捕获,有该层的finally也执行,除非finally遇到不执行的情况;

2)如果该层没有catch进行捕获,就向外抛出,去找catch,如果没有catch进行捕获,就终止程序。

【课后作业2 动手动脑】

编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。

要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。

import java.util.Scanner;

public class Score {

public static void main(String[] args) {

// TODO Auto-generated method stub
boolean f=true,h=true,q=true;
int Sc=0;
while(f){
System.out.println("Please input a score:");
Scanner s=new Scanner(System.in);
String ss=s.nextLine();
int a=ss.length();
for(int i=0;i<a;i++){
if((ss.charAt(i)<'0')||(ss.charAt(i)>'9'))
break;
else
{
q=false;
h=false;
}
}
if(q){
try{
throw new ScException();
}
catch(ScException e){
System.out.println("格式错误");
}
}
      if(!h) //输入的是数字
{
Sc=Integer.parseInt(ss);
if((Sc<0)||(Sc>100))
{
try{
ScException x= new ScException();
throw x;
}
catch(ScException x){
System.out.println("输入异常,请输入整数");
}
}
else
f=false;
}
}
if(Sc<60)
System.out.println("不及格");
else if(Sc<70)
System.out.println("及格");
else if(Sc<80)
System.out.println("中");
else if(Sc<90)
System.out.println("良");
else if((Sc<100)||(Sc==100))
System.out.println("优");
}

}

class ScException extends Exception{
public ScException(){
}
}

结果截图:

 

转载于:https://www.cnblogs.com/DaisyYuanyq/p/7845941.html

你可能感兴趣的文章
Attributes.Add用途与用法
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
javascript 无限分类
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
OpenFire 的安装和配置
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>
海上孤独的帆
查看>>
error: more than one device and emulator 问题解决
查看>>
Django 学习
查看>>
Linux-socket的close和shutdown区别及应用场景
查看>>
xpath
查看>>
parted分区
查看>>
图片标签img
查看>>
表哥的Access入门++以Excel视角快速学习数据库知识pdf
查看>>
TC 配置插件
查看>>
关于异步reset
查看>>