java异常处理例题代码(精)
- 格式:doc
- 大小:21.50 KB
- 文档页数:8
Java异常架构与异常关键字1. Java异常简介Java异常是Java提供的一种识别及响应错误的一致性机制。
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。
在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。
2. Java异常架构1. ThrowableThrowable 是 Java 语言中所有错误与异常的超类。
Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。
Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
2. Error(错误)定义:Error 类及其子类。
程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
特点:此类错误一般表示代码运行时 JVM 出现问题。
通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。
比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。
此类错误发生时,JVM 将终止线程。
这些错误是不受检异常,非代码性错误。
因此,当此类错误发生时,应用程序不应该去处理此类错误。
按照Java惯例,我们是不应该实现任何新的Error子类的!3. Exception(异常)程序本身可以捕获并且可以处理的异常。
Exception 这种异常又分为两类:运行时异常和编译时异常。
运行时异常定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。
特点:Java 编译器不会检查它。
也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。
Java⽇常练习题,每天进步⼀点点(11)⽬录1、对接⼝的描述正确的是()2、类中的数据域使⽤private修饰为私有变量,所以任何⽅法均不能访问它。
3、已知如下类定义:4、在java的⼀个异常处理中,可以包含多个的语句块是()。
5、关于Java语⾔中的final关键字的使⽤,下列说法正确的是()6、在 main() ⽅法中给出的整型数组,如果将其写到⼀个⽂件中,需要()。
7、下列有关Servlet的⽣命周期,说法不正确的是?8、What is displayed when the following is executed?9、假定Base b = new Derived(); 调⽤执⾏b.methodOne()后,输出结果是什么?10、下⾯关于变量及其范围的陈述哪些是不正确的()答案汇总:总结承蒙各位厚爱,我们⼀起每天进步⼀点点!(⿏标选中空⽩处查看答案)1、对接⼝的描述正确的是()正确答案: A⼀个类可以实现多个接⼝接⼝可以有⾮静态的成员变量在jdk8之前,接⼝可以实现⽅法实现接⼝的任何类,都需要实现接⼝的⽅法题解:A,⼀个类只能有⼀个直接⽗类,但是继承是有传递性的。
⼀个类可以实现多的接⼝。
⼀个接⼝可以继承多个类。
B,接⼝中没有普通变量(普通成员变量),接⼝中都是常量,默认修饰符:public static finalC,JDK8之前,接⼝中的⽅法都是默认public abstract的,JDK8之后,接⼝中可以有static、default的修饰的⽅法,⼀旦被修饰,⽅法必须有⽅法体(抽象⽅法可是没有⽅法体的),接⼝中的⽅法都不能被private和protected 修饰,同时外部接⼝、类只能被public修饰或者不写,但是内部接⼝、类可以被四个访问修饰符修饰。
D,实现接⼝,其实就是需要重写接⼝中的abstract⽅法,⼀旦实现的类没有重写完,那么这个类必须是个抽象类(抽象类中可以没有抽象⽅法,但是有抽象⽅法的类必须是抽象类)。
Java⽇常练习题,每天进步⼀点点(60)⽬录1、假设 A 类有如下定义,设 a 是 A 类同⼀个包下的⼀个实例,下列语句调⽤哪个是错误的?()2、Java中基本的编程单元为:3、下列代码的执⾏结果是:()4、给定以下JAVA代码,这段代码运⾏后输出的结果是()5、以下哪⼀项正则能正确的匹配⽹址: /video/av21061574 ()6、下列关于异常处理的描述中,错误的是()。
7、以下哪项不属于java类加载过程?8、对于⽂件的描述正确的是()9、有关hashMap跟hashtable的区别,说法正确的是?10、java中 String str = "hello world"下列语句错误的是?答案汇总:总结承蒙各位厚爱,我们⼀起每天进步⼀点点!(⿏标选中空⽩处查看答案)1、假设 A 类有如下定义,设 a 是 A 类同⼀个包下的⼀个实例,下列语句调⽤哪个是错误的?()class A{ int i; static String s; void method1() { } static void method2() { } }正确答案:CA System.out.println(a.i);B a.method1();C A.method1();D A.method2()题解:1、⾮静态⽅法只能通过实例对象来调⽤,不能直接通过类名调⽤。
静态⽅法(static)才能通过类名直接调⽤.2、类中变量:除了private权限外,其他权限的变量(没有表⽰默认default),均可以⽤“对象.变量名”来调⽤。
对于private变量,即使使⽤static,也不能⽤“类.变量名”来调⽤私有变量。
只能通过类中的public get()⽅法来调⽤。
类中⽅法:除了private权限外,其他权限的⽅法(没有表⽰默认default),均可以⽤“对象.⽅法名”来调⽤。
private ⽅法可以⽤java反射机制调⽤。
选择题1、JAVA所定义的版本中不包括:( D )A、JAVA2 EEB、JAVA2 CardC、JAVA2 MED、JAVA2 HEE、JAVA2 SE2、下列说法正确的是( A )A、JAVA程序的main方法必须写在类里面B、JAVA程序中可以有多个main方法C、JAVA程序中类名必须与文件名一样D、JAVA程序的main方法中如果只有一条语句,可以不用{}(大括号)括起来3、变量命名规范说法正确的是( B )A、变量由字母、下划线、数字、$符号随意组成;B、变量不能以数字作为开头;C、A和a在java中是同一个变量;D、不同类型的变量,可以起相同的名字;4、下列javaDoc注释正确的是( C )A、/*我爱北京天安门*/B、//我爱北京天安门*/C、/**我爱北京天安门*/D、/*我爱北京天安门**/5、为一个boolean类型变量赋值时,可以使用( B )方式A、boolean = 1;B、boolean a = (9 >= 10);C、boolean a="真";D、boolean a = = false;6、以下( C )不是合法的标识符A、STRINGB、x3x;C、voidD、de$f7、表达式(11+3*8)/4%3的值是( D )A、31B、0C、1D、28、( A )表达式不可以作为循环条件A、i++;B、i>5;C、bEqual = str.equals("q");D、count = = i;9、运算符优先级别排序正确的是(A )A、由高向低分别是:()、!、算术运算符、关系运算符、逻辑运算符、赋值运算符;B、由高向低分别是:()、关系运算符、算术运算符、赋值运算符、!、逻辑运算符;C、由高向低分别是:()、算术运算符、逻辑运算符、关系运算符、!、赋值运算符;D、由高向低分别是:()、!、关系运算符、赋值运算符、算术运算符、逻辑运算符;10、以下程序的运行结果是:( B )public class Increment{public static void main(String args[]) { int a;a = 6;}}A.666B.667C.677D.67611、下列值不为true的表达式有( C )。
Java如何将处理完异常之后的程序能够从抛出异常的地点向下执⾏?因为Java中的异常处理理论,⽀持的是终⽌模型,在这种模型中,抛出异常之后,程序⽆法返回到异常发⽣的地⽅向下继续执⾏。
但是,如果我们现在想要Java实现类似恢复模型的⾏为,希望异常在处理之后继续往下进⾏执⾏,那么有什么解决的办法吗?思路:把try块放在while循环⾥,这样就能不断的进⼊try块,直到获得满意的结果结束。
下来看下⾯的程序:package exceptions;class MyException extends Exception {}public class ContinueException {private static int count;private static final int COUNTNUMBER = 1;public static void main(String[] args) {while (true) {try {if (++count == COUNTNUMBER) {throw new MyException();}System.out.println("Continue run after throw MyException");} catch (MyException e) {// TODO: handle exceptionSystem.out.println("Caught MyException");}finally {if(count == COUNTNUMBER + 1) break;}}}}程序执⾏结果为:Caught MyExceptionContinue run after throw MyException从结果我们可以看到,在异常处理完之后,程序继续向下执⾏了,打印出了结果。
这个程序给我们的思路就是:如果把try块放在循环⾥,并为抛出异常的语句之前建⽴⼀个条件语句,就有可能根据条件语句使下次执⾏的时候,跳过抛出异常的地⽅,向下执⾏。
在Java中,异常处理主要涉及到以下几个关键字:
1. `try`: 用于捕获可能抛出异常的代码块。
这些代码块通常是可能会抛出异常的代码,例如I/O操作、除零操作等。
2. `catch`: 用于捕获并处理特定类型的异常。
你可以有多个`catch`块来处理不同类型的异常。
3. `finally`: 无论是否发生异常,`finally`块中的代码都会执行。
通常用于资源的清理操作,如关闭文件、数据库连接等。
4. `throw`: 用于手动抛出异常。
当你在代码中遇到错误或异常情况时,可以使用`throw`关键字抛出异常。
5. `throws`: 用于声明方法可能抛出的异常。
在方法签名中使用`throws`关键字可以告知调用者该方法可能会抛出的异常类型。
6. `try-catch-finally` 语句: 这是Java中处理异常的主要结构,它结合了`try`, `catch`, 和 `finally` 关键字。
这些关键字在Java的异常处理机制中起着重要的作用,帮助开发者更有效地管理可能出现的错误和异常情况。
2020年计算机二级《JAVA》章节练习题:异常和断言第6章异常和断言1[单选题]哪个关键字能够抛出异常? ( )A.transientB.finallyC.throwD.static参考答案:C2[单选题]给出一段程序,试判断哪个是准确的结果( )public class rtExcept{public static void throwit(){System.out.print(“throwit”);throw new RuntimeException();}public static void main(String [] aa){try{System.out.print(“hello “);throwit(); }catch(Exception re){System.out.print(“caught ”); }finally{System.out.print(“finally ”); }System.out.print(“after ”);}}A.hello throwit caughtB.hello throwit caught finally afterC.hello throwit RuntimeException afterD.hello throwit caught finally after RuntimeException 参考答案:B3[单选题]下列叙述中准确的是A.软件测试应该由程序开发者来完成B.程序经调试后一般不需要再测试C.软件维护只包括对程序代码的维护D.以上三种说法都不对参考答案:D4[单选题]参考答案:B5[单选题]给出一段程序,试判断哪个是准确的结果( ) public class myprogram{public static void main (String args[]){try{System.out.print(“Hello world ”); }finally{System.out.println(“Finally executing”); }}}A.无法编译,因为没有指定异常B.无法编译,因为没有catch子句C.Hello worldD.Hello world Finally executing参考答案:B6[填空题]数据独立性分为逻辑独立性与物理独立性。
App9_1.java:输出一个数组的所有元素,捕获数组下标越界异常和除娄为0异
常。
public class App9_1{
public static void main(String args[]{
int i;
int[] a={1,2,3,4};
for(i=0;i<5;i++
System.out.println(" a["+i+"]="+a[i];
System.out.println("5/0"+(5/0;
}
}
App9_2.java:使用try-catch-finall语句对程序中的异常进行捕获与处理。
public class App9_2{
public static void main(String args[]{
int i;
int a[]={1,2,3,4};
for (i=0;i<5;i++{
try{
System.out.print("a["+i+"]/"+i+"="+(a[i]/i;
}
catch(ArrayIndexOutOfBoundsException e{
System.out.print("捕获到了数组下标越界异常";
}
catch(ArithmeticException e{
System.out.print("异常类名称是:"+e; //显示异常信息
}
catch(Exception e{
System.out.println("捕获"+e.getMessage(+"异常!"; //显示异常信息
}
finally{
System.out.println(" finally i="+i;
}
}
System.out.println("继续!!";
}
}
App9_3.java:使用throw语句在方法中抛出异常。
public class App9_3{
public static void main(String args[]{
int a=5,b=0;
try{
if (b==0
throw new ArithmeticException(; //抛出异常,不是必须的
else
System.out.println(a+"/"+b+"="+a/b; //若不抛出异常,则运行此行
}
catch(ArithmeticException e{
System.out.println("异常:"+e+"被抛出了!";
e.printStackTrace(; //显示异常信息
}
}
}
App9_4.java:求阶乘并捕获可能出现的三种异常。
public class App9_4{
public static double multi(int n{
if(n<0
throw new IllegalArgumentException("求负数阶乘异常";
double s=1;
for(int i=1;i<=n;i++ s=s*i;
return s;
}
public static void main(String[] args{
try{
int m=Integer.parseInt(arg[0];
System.out.println(m+"!="+multi(m; //调用方法multi求阶乘。
}
catch (ArrayIndexOutOfBoundsException e{
System.out.println("命令行中没提供参数!";
}
catch (NumberFormatException e{
System.out.println("应输入一个整数!";
}
catch (IllegalArgumentException e{
System.out.println("出现的异常是:"+e.toString(;
}
finally{
System.out.println("程序运行结束!";
}
}
}
App9_5.java:判断数字并捕获可能出现的三种异常。
//App9_5.java 使用throws语句在方法之中抛出异常
public class App9_5{
static void check(String str1 throws NullPointerException{ //方法头抛出空指针异常
if(str1.length(>2{
str1=null;
System.out.println(str1.length(; //空字符串的长度
}
char ch;
for (int i=0;i
ch=str1.charAt(i;
if (!Character.isDigit(ch //判断参数中字符是否为数字
throw new NumberFormatException(; //方法中抛出数字格式异常
}
}
public static void main(String args[] throws Exception{ //抛出异常给系统处理
int num;
try{
check(args[0];
num=Integer.parseInt(args[0];
if (num>60
System.out.println("成绩为:"+num+" 及格";
else
System.out.println("成绩为:"+num+" 不及格";
}
catch(NullPointerException e{
System.out.println("空指针异常:"+e.toString(;
}
catch(NumberFormatException ex{
System.out.println("输入的参数不是数值类型";
}
catch(Exception e{
System.out.println("命令行中没有提供参数";
}
}
}
App9_6.java:利用IOException的异常处理。
//App9_6.java 利用IOException的异常处理
import java.io.*; //加载java.io类库里的所有类
public class App9_6{
public static void main(String args[] throws IOException{
String str;
int num;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in;
while (true{
try{
System.out.println("请输入字符串:";
str=buf.readLine(; //将从键盘输入的数据赋给变量str
if (str.length(>0
break;
else
throw new IOException(; //抛出输入/输出异常
}
catch (IOException e{
System.out.println("必须输入字符串!!";
continue;
}
}
String s=str.toUpperCase(; //将str中的内容转换成大写,赋给变量s
System.out.println("转换后的字符串为:"+s;
}
}
App9_7.java:自定义异常类。
import java.io.*;
class CircleException extends Exception{ //自定义异常类
double radius;
CircleException(double r{ //有参构造方法
radius=r;
}
public String toString({
return "半径 r= "+radius+" 不是一个正数!";
}
}
class Circle{
private double radius;
public void setRadius(double r throws CircleException{
if (r<0
throw new CircleException(r;
else
radius=r;
}
public void show({
System.out.println("圆面积 = "+3.14*radius*radius;
}
}
public class App9_7{
public static void main(String args[]{
Circle cir=new Circle(;
try{
cir.setRadius(-2;
}
catch(CircleException e{
System.out.println("自定义异常:"+e.toString(+" ";
}
cir.show(;
}
}