Java课后练习9(异常处理)

动手动脑1:

import javax.swing.*;

class AboutException {
public static void main(String[] a)
{
int i=1, j=0, k;
k=i/j;

try
{

k = i/j; // Causes division-by-zero exception
//throw new Exception("Hello.Exception!");
}

catch ( ArithmeticException e)
{
System.out.println("被0除. "+ e.getMessage());
}

catch (Exception e)
{
if (e instanceof ArithmeticException)
System.out.println("被0除");
else
{
System.out.println(e.getMessage());

}
}

finally
{
JOptionPane.showConfirmDialog(null,"OK");
}

}
}

输出结果:

动手动脑2:

代码:

public class CatchWho {
public static void main(String[] args) {
try {
try {
throw new ArrayIndexOutOfBoundsException();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
}

throw new ArithmeticException();
}
catch(ArithmeticException e) {
System.out.println("发生ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
}
}

输出结果:

动手动脑3;

源代码:

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");

}

}

}

输出结果:

动手动脑4:当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

源代码:
public class SystemExitAndFinally {

public static void main(String[] args)
{

try{

System.out.println("in main");

throw new Exception("Exception is thrown in main");

//System.exit(0);

}

catch(Exception e)

{

System.out.println(e.getMessage());

System.exit(0);

}

finally

{

System.out.println("in finally");

}
}
}

输出结果:

动手动脑5:

finally语句块一定会执行吗?

至少有两种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前return就返回了,这样finally语句就不会执行。这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。

(2)在try块|catch块中有System.exit(0);这样的语句。System.exit(0)是终止java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

源代码:

// UsingExceptions.java
// Demonstrating the getMessage and printStackTrace
// methods inherited into all exception classes.
public class PrintExceptionStack {
public static void main( String args[] )
{
try {
method1();
}
catch ( Exception e ) {
System.err.println( e.getMessage() + "\n" );
e.printStackTrace();
}
}

public static void method1() throws Exception
{
method2();
}

public static void method2() throws Exception
{
method3();
}

public static void method3() throws Exception
{
throw new Exception( "Exception thrown in method3" );
}
}

输出截图:

动手动脑6:

如何跟踪异常的传播路径?

当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。

可使用printStackTrace 和 getMessage方法了解异常发生的情况: printStackTrace:打印方法调用堆栈。

每个Throwable类的对象都有一个getMessage方法,它返回一个字串,这个字串是在Exception构造函数中传入的,通常让这一字串包含特定异常的相关信息。

源代码:

import java.io.*;
public class ThrowMultiExceptionsDemo {
public static void main(String[] args)
{
try {
throwsTest();
}
catch(IOException e) {
System.out.println("捕捉异常");
}
}

private static void throwsTest() throws ArithmeticException,IOException {
System.out.println("这只是一个测试");
// 程序处理过程假设发生异常
throw new IOException();
//throw new ArithmeticException();
}
}

输出截图:

一个方法可以声明抛出多个异常

int g(float h) throws OneException,TwoException { …… }

这只是一个测试
捕捉异常

import java.io.*;

public class Test
{
public void test()throws IOException
{
FileInputStream fis = new FileInputStream("a.txt");
}
}
class Sub extends Test
{
//如果test方法声明抛出了比父类方法更大的异常,比如Exception
//则代码将无法编译……
public void test() throws FileNotFoundException
{
//...
}
}

一个子类的throws子句抛出的异常,不能是其基类同名方法抛出的异常对象的父类。

动手动脑7:

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

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

源代码:

import javax.swing.JOptionPane;
public class Score {
public static void main(String[] args){
for(;;)
{
String a = JOptionPane.showInputDialog("请输入一个成绩:");
try{
int b = Integer.parseInt(a);
if(b>0&&b<60){
JOptionPane.showMessageDialog(null,
"不及格!");
break;
}
else if(b>=60&&b<=70)
{
JOptionPane.showMessageDialog(null,
"及格!");
break;
}
else if(b>70&&b<=80)
{
JOptionPane.showMessageDialog(null,
"成绩中等!");
break;
}
else if(b>80&&b<=90)
{
JOptionPane.showMessageDialog(null,
"成绩良好!");
break;
}
else if(b>90&&b<=100)
{
JOptionPane.showMessageDialog(null,
"成绩优秀!");
break;
}
else if(b>100||b<0)
{
JOptionPane.showMessageDialog(null,
"您输入的成绩超出范围,请重新输入!");
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null,
"您的输入有误,请重新输入!");
}
}

}
}

输出截图:

时间: 2024-10-14 07:06:47

Java课后练习9(异常处理)的相关文章

复习java基础第二天(异常处理)

一.常见的异常类型: public class TestException { public static void main(String[] args) { int i = 10; //数学异常: java.lang.ArithmeticException int j = i / 0; System.out.println(j); int [] scores = new int[]{1, 2, 4, 5}; //数组下标越界异常: java.lang.ArrayIndexOutOfBound

Java 编程中关于异常处理的 10 个最佳实践

异常处理是书写 强健 Java应用的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了优雅的处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch和finally 关键字的形式内建于语言自身之中.Java编程语言也允许你创建新的异常,并通过使用  throw 和 throws关键字抛出它们.事实上,异常处理不仅仅是知道语法.书写一个强健的代码更多的是一门艺术而不仅仅是一门科学,这里我们将讨论一些关于异常处理的Java最佳实践.这些 J

java不求有功,但求无过—异常处理

在程序开发中,错误往往有两种.一种是编译时出现的错误,该种错误比较容易发现.另一种是运行时出现的错误,该种错误是开发人员比较头疼的.异常就是一个运行时的错误,例如,除数为0 ,数组越界等. 异常处理,就是我们定义一个代码段(可能出错的代码段)来捕获和处理异常. 这样当异常情况发生时,一个代表该异常的对象会被创建,并在产生异常的方法中被引发.该方法可以选择自己处理异常,也可以抛出该异常,但无论是哪种,最终异常都会被处理. 例如以下的代码: import java.io.*; public clas

JAVA之IO技术异常处理机制

package ioTest.io1; import java.io.FileWriter; /* * IO异常的处理: * 读或写实际上都是调用系统的资源区做操作.只要和系统资源相关的都有可能出现异常. */ import java.io.IOException; public class FileWriterDemo1 { public static void main(String[] args) { FileWriter fWriter=null;//在外层创建对象的引用,在try代码块

Java编程中关于异常处理的10个要点

Java编程中关于异常处理的10个要点 如果是可恢复错误,使用检查型异常;如果是编程错误,使用非检查型异常.许多Java编程人员都很苦恼,到底是该选择检查型异常还是非检查型异常.检查型异常是一种从语言到强制你编写代码的一种方式,可以保证你对错误条件提供异常处理代码,但同时也会引入大量杂乱的代码导致其不可读.如果你有恢复策略的话,这样做看起来似乎也可以. 在finally程序块中关闭或者释放资源Java程序员对此都有所了解,在处理网络和IO类的时候,相当于一个标准.在finally块中关闭资源, 

JAVA中IO和异常处理练习

1.SystemI\O练习:1)通过键盘输入若干字符,并通过显示器输出:2)定义一个静态方法validOrNot()用于对输入的字符进行合法性校验,若包含非英文字符,则抛出IllegalStringException异常:3)通过Try/Catch异常处理机制,处理异常:若包含非英文字符,给予相应提示:若只包含英文字符,则统计字符数量,并输出. 1 package iooutput; 2 3 import java.io.BufferedReader; 4 import java.io.IOEx

Java课后练习6

动手动脑1:阅读QiPan.java示例程序了解如何利用二维数组和循环语句绘制五子棋盘 1)源代码:import java.io.*; public class QiPan{ //定义一个二维数组来充当棋盘 private String[][] board; //定义棋盘的大小 private static int BOARD_SIZE = 15; public void initBoard() {  //初始化棋盘数组  board = new String[BOARD_SIZE][BOARD

Java读书笔记(1)-异常处理

2015-12-31 一.异常处理 异常概述 (Exception/Error) 异常处理机制 使用try{}catch()捕获异常 异常类的继承体系(先处理小异常,再处理大异常) Java7提供的多异常捕获 访问异常信息 使用finally回收资源(显式回收物理资源 垃圾回收堆内存 return System.exit(1)) 异常处理的嵌套 Java7的自动关闭资源的try语句(带括号) Checked异常和Runtime异常体系 使用throws声明抛出异常(方法签名) 使用throw抛出

Java课后练习3

动手动脑1:手写随机代码 程序:package test;public class sgg{private static final int N = 200;private static final int LEFT = 40;private static final int RIGHT = 10000;private static long x0 = 1L;private long a = 1103515245L;private long c = 12345L;private long m =