07异常处理

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java、Android 数组转集合

<array name"title"><item>51巅峰钜惠</item><item>十大星级品牌联盟&#xff0c;全场2折起</item><item>生命不是要超越别人&#xff0c;而是要超越自己。</item><item>己所不欲&#xff0c;勿施于人。——孔子<…

mac instantclient_12_2 安装配置

1、创建一个目录进行文件存放 mkdir oraclecd oracle2、instantclient_12_2文件拷贝到oracle目录下 3、拷贝重要文件到~/lib目录 mkdir ~/libln -s instantclient_12_2/libclntsh.dylib ~/lib/cp instantclient_12_2/{libclntsh.dylib.12.1,libnnz12.dylib,libociei.dylib} …

工作166:正确eachrt渲染方式

1第一步 2第二步 3第三步

Effective C++: 06继承与面向对象设计

32&#xff1a;确定你的public继承塑模出is-a关系 以C进行面向对象编程&#xff0c;最重要的一个规则是&#xff1a;public继承表示的是"is-a"&#xff08;是一种&#xff09;的关系。 如果令class D以public形式继承class B&#xff0c;你便是告诉编译器说&#xff…

Android轮播图 banner,图片视频混播banner

1、使用Android循环滚动控件——ViewFlipper实现方法&#xff1a;https://blog.csdn.net/meixi_android/article/details/84615857 2、使用第三方module实现方法&#xff1a; 需要引入的module下载链接&#xff1a;https://pan.baidu.com/s/1sdlQefBTfkLsNO__ouwz8w 添加mod…

oracle 实现 drop table if exists

使用如下代码进行替换&#xff1a; BEGINEXECUTE IMMEDIATE DROP TABLE this_table; EXCEPTIONWHEN OTHERS THENNULL; END;

Android recycleview使用详解,recycleview实现九宫格布局即横向排列,recycleview设置item占位数量大号item或小号item

1、添加recycleview依赖 compile(com.android.support:recyclerview-v7:25.1.1) {force true } 2、item.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xm…

cesium billboard 点击 不想显示infobox

cesium的一些实体默认点击&#xff0c;会弹出infobox。 如果不想弹出&#xff0c; 初始化的时候加上参数infoBox: false。 不想显示选中&#xff0c; 初始化的时候加上参数selectionIndicator: false。 示例&#xff1a; var viewer new Cesium.Viewer(cesiumContainer,…

工作168:代码中的删除逻辑处理

1首先找到对应方法里面的删除方法 2点击之后进行删除操作 在当前方法里面直接进行混入删除 删除结束

java如何对List集合中的元素进行排序(请收藏)

在java开发中有时候我们需要对List集合中的元素按照一定的规则进行排序&#xff0c;比如说有个Person的集合&#xff0c;我们要根据Person的age属性进行排序输出&#xff0c;这就需要用到Java中提供的对集合进行操作的工具类Collections&#xff0c;其中的sort方法&#xff0c;…

cesium面板动态显示并跟随移动

我的需求&#xff0c;首先显示一个billboard&#xff0c;点击billboard后&#xff0c;在旁边显示一个div面板&#xff0c;并且该面板随着地图拖拽也能进行相对运动。 概要实现步骤&#xff1a; 1、自定义div面板&#xff0c;面板需要设置id值 2、使用我自己定义的函数&#…

工作169:删除操作

this.$confirm(你正在进行删除操作, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,type: warning}).then(()>{deleteAction(path.join(this.url.delete, record.id))this.$message.success(res.msg);}).catch((err)>{this.$message.warning(err);})

Android 设置view透明度,广告标题透明背景

android:alpha"0.8" <ImageViewandroid:layout_width"match_parent"android:layout_height"match_parent"android:alpha"0.8"android:background"drawable/bantouheibg"/> colors<!-- 透明色 --> <color na…

bootstrapselect使用 Bootstrap's dropdowns require Popper.js

虽然我目前喜欢用vue&#xff0c;但是有一些项目会用bootstrap进行配合。 下面介绍一款bootstrap生态链的插件&#xff1a;bootstrapselect。 官网地址&#xff1a;https://www.bootstrapselect.cn/ 特别要注意一点&#xff0c;引入bootstrapselect前要先引入popper.js。 由…

Android recycleview实现混合itemview,以及recycleview添加头部尾部

需要引入的module链接&#xff1a;https://pan.baidu.com/s/1kcVye2vT4M0mdCtzYpUVKw 添加module方法步骤&#xff1a;https://blog.csdn.net/meixi_android/article/details/84655666 1、主要adapter /*** 作者&#xff1a;created by meixi* 邮箱&#xff1a;131647168401…

工作170:删除做个判断操作 成功删除 取消取消

this.$confirm(你正在进行删除操作, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,type: warning}).then((res)>{deleteAction(path.join(this.url.delete, record.id))this.$message.success(res);}).catch((err)>{this.$message.warning(err);})

docker 报错 Container is not running

我在运行docker exec -it 56b90db5253e /bin/bash报错。 出现这个问题&#xff0c;是因为Container容器之前已经启动过了 需要执行docker start 56b90db5253e就可以解决了。

Android侧滑删除-RecyclerView轻松实现高效的侧滑菜单

1 删除整个RecyclerView hisList.clear(); hisAdapter.notifyDataSetChanged(); mScanListAdapter.setNewData(null); 刚开始只是使用了list.clear() 方法就是没有效果&#xff0c;最后想起来了忘记了notifyDataSetChanged 刷新了 2 RecyclerView 删除Item hisList.remov…

返回数组中的最大数 -freeCodeCamp

找出多个数组中的最大数 右边大数组中包含了4个小数组&#xff0c;分别找到每个小数组中的最大值&#xff0c;然后把它们串联起来&#xff0c;形成一个新数组。 给出的数组如下&#xff1a; largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 85…