java 异常练习题_Java 异常(习题)
異常
Key Point
* 異常的概念和分類
* 異常的產(chǎn)生和傳遞
* 異常的處理
* 自定義異常
練習(xí)
1. 填空
Java 中所有的錯(cuò)誤都繼承自throwable類;在該類的子類中,
Error類表示嚴(yán)重的底層錯(cuò)誤,對于這類錯(cuò)誤一般處理的方式是不要求我們對其處理
Exception類表示例外、異常。
2. 查api,填空
異常類java.rmi.AlreadyBoundException,從分類上說,該類屬于已檢查(已檢查|
未檢查)異常,從處理方式上說,對這種異常 必須處理,進(jìn)行聲明拋出或異常捕獲;
異常類java.util.regex.PatternSyntaxException,從分類上說,該類屬于未檢查(已檢
查|未檢查)異常,從處理方式上說,對這種異常不作處理。
3. (異常的產(chǎn)生)把下面代碼補(bǔ)充完整
public class TestThrow{
public static void main(String args[]){
throwException(10);
}
public static void throwException(int n){
if (n == 0){
//拋出一個(gè)NullPointerException
throw new
NullPointerException();}else{
//拋出一個(gè)ClassCastException
//并設(shè)定詳細(xì)信息為“類型轉(zhuǎn)換出錯(cuò)”
throw new
ClassCastException("類型轉(zhuǎn)換出錯(cuò)");}
}
}
4. (try-catch-finally)有如下代碼:
import java.io.*;
import java.sql.*;
class TestException{
public static void main(String args[]){
System.out.println(“main 1”);
int n;
//讀入n
ma(n);
System.out.println(“main2”);
}
public static void ma(int n){
try{
System.out.println(“ma1”);
mb(n);
System.out.println(“ma2”);
}catch(EOFException e){
System.out.println(“Catch EOFException”);
}catch(IOException e){
System.out.println(“Catch IOException”);
}catch(SQLException e){
System.out.println(“Catch SQLException”);
}catch(Exception e){
System.out.println(“Catch Exception”);
}finally{
System.out.println(“In finally”);
}
}
public static void mb(int n) throws Exception{
System.out.println(“mb1”);
if (n == 1) throw new EOFException();
if (n == 2) throw new FileNotFoundException();
if (n == 3) throw new SQLException();
if (n == 4) throw new NullPointerException();
System.out.println(“mb2”);
}
}
問:當(dāng)讀入的n 分別為1,2,3,4,5 時(shí),輸出的結(jié)果分別是什么?
結(jié)果: n = 1
main 1
ma1
mb1
Catch EOFException
In finally
main2
n = 2
main 1
ma1
mb1
Catch IOException
In finally
main2
n = 3
main 1
ma1
mb1
Catch SQLException
In finally
main2
n = 4
main 1
ma1
mb1
Catch Exception
In finally
main2
n = 5
main 1
ma1
mb1
mb2
ma2
In finally
main25. (自定義異常)創(chuàng)建兩個(gè)自定義異常類MyException1
和MyException2。
要求:
1) MyException1 為已檢查異常,MyException2 為未檢查異常
2) 這兩個(gè)異常均具有兩個(gè)構(gòu)造函數(shù),一個(gè)無參,另一個(gè)帶字符串參數(shù),參數(shù)表示產(chǎn)生
異常的詳細(xì)信息。
public class MyException1 extends
Exception{
public MyException1() {
}
public
String MyException1(String str) {
return str;
}
}
public class MyException2
extends RuntimeException{
public MyException2() {
}
public String MyException2(String str) {
return str;
}
}6.
(自定義異常)在上一題的基礎(chǔ)上,把下面代碼補(bǔ)充完整。
public class TestMyException{
static MyException1 me = new
MyException1();public static void main(String
args[]){
int n;
//讀入n
try{
m(n);
}catch(MyException1 ex1){
//輸出ex1 詳細(xì)的方法調(diào)用棧信息
System.out.println(me.getStackTrace1());
}catch(MyException2 ex2){
//輸出ex2 的詳細(xì)信息
//并把ex2 重新拋出
String str = "n == 2";
System.out.println(ex2.MyException2(str));
throw new
MyException2();}
}
public static void m(int n)_________ { //聲明拋出MyException1
if (n == 1) {
//拋出MyException1
//并設(shè)定其詳細(xì)信息為“n == 1”
String str = "n == 1";
me.setStackTrace(str);
throw new
MyException1();
}else {
//拋出MyException2
//并設(shè)定其詳細(xì)信息為“n == 2”
throw new
MyException2();}
}
}
7. (try-catch)代碼改錯(cuò)。
class MyException extends
Exception{}
class TestException{
public static void main(String args[]){
ma();
}
public static int ma(){
try{
m();
return 100;
}catch(Exception e){
System.out.println(“Exception”);
return 0;}
//catch(ArithmeticException e){
//System.out.println(“ArithmeticException”);
//}}
public static void m()throws MyException{
throw new MyException();
}
}
8. (方法覆蓋)有如下代碼
import java.io.IOException;
class Super{
public void ma() throws IOException{}
}
interface IA{
void mb();
}
public class MySub extends Super implements IA{
public void ma() //1_________{
}
public void mb() //2_________{
}
}
問:
在//1 處,填入以下________代碼可以編譯通過,在//2 處,填入_________代碼可以編譯
通過。
A. throws java.io.IOException
B. throws java.io.FileNotFoundException, java.io.EOFException
C. throws java.sql.SQLException
D. 不能拋出任何異常。
9. *(異常處理)有如下代碼
import java.io.*;
import java.sql.*;
public class TestTryCatch{
public static void main(String args[])throws
Exception{
try{
ma(10);
System.out.println(“No Exception”);
}
catch(EOFException ex1){
System.out.println(“ex1”);
}
catch(IOException ex2) {
System.out.println(“ex2”);
}
catch(SQLException ex3) {
System.out.println(“ex3”);
}
}
public static void ma(int n) throws Exception{
if (n == 1){
throw new IOException();
}else if (n == 2){
throw new EOFException();
}else if (n == 3) {
throw new SQLException();
}
}
}
選擇正確答案:
A. 編譯不通過
B. 編譯通過,輸出No Exception
C. 編譯通過,輸出ex1
D. 編譯通過,輸出ex2
E. 編譯通過,輸出ex3
結(jié)果:A
10. *(try-catch,局部變量)有如下代碼
public class TestTryCatch{
public static void main(String args[]){
System.out.println( ma() );
}
public static int ma(){
int n;
try{
n = 10/0;
}catch(Exception e){
}
return n;
}
}
選擇正確答案:
A. 編譯不通過
B. 編譯通過,輸出-1
C. 編譯通過,輸出0
結(jié)果:A.
11. *(try-catch-finally)有如下代碼
public class TestFinally{
public static void main(String args[]){
System.out.println ( ma() );
}
public static int ma(){
int b;
//讀入b
try{
int n = 100;
return n/b;
}catch(Exception e){
return 10;
}finally{
return 100;
}
}
}
在ma 中,當(dāng)讀入的b 為100 時(shí),輸出結(jié)果為__100__,當(dāng)讀入的b 為0 時(shí),輸出結(jié)果為
__100___。12.
*(try-finally)寫出下面代碼運(yùn)行的結(jié)果
public class TestTryFinally{
public static void main(String args[]){
try{
ma();
}catch(Exception ex1){
}
}
public static void ma() throws Exception {
int n = 10;
int b;
//讀入一個(gè)整數(shù)b
try{
System.out.println(“ma1”);
int result = n / b;
System.out.println(“ma2 ” + result);
}finally{
System.out.println(“In Finally”);
}
}
}
在ma 中,讀入整數(shù)b,如果讀入的值為10,則輸出:
ma1
ma2 =1
In Finally如果讀入的值為0,則輸出:
ma1
In Finally
13. *(方法覆蓋)
import java.io.*;
class MySuper{
public void m() throws IOException{}
}
class MySub extends MySuper{
public void m() throws EOFException, FileNotFoundException{}
}
class MySub2 extends MySub {
public void m() throws FileNotFoundException{}
}
以上代碼是否能編譯通過?如果不能,應(yīng)該如何修改?
14. *(自定義異常)完成某個(gè)計(jì)費(fèi)系統(tǒng)的用戶登錄和注冊模塊,要求如下:
1) 創(chuàng)建一個(gè)User 類,包括:用戶登錄名(username)、密碼(password)、用戶真實(shí)姓
名(name)、電子郵件地址(email)屬性和相應(yīng)的構(gòu)造方法及set/get 方法。
2) 創(chuàng)建兩個(gè)自定義異常類,一個(gè)LoginException,表示登錄異常。一個(gè)RegisterException,
表示注冊異常。自定義的兩個(gè)異常,都要求有一個(gè)接受字符串類型參數(shù)的構(gòu)造方法。
3) 創(chuàng)建一個(gè)UserBiz 接口,該接口中定義兩個(gè)方法:
void register(String username, String password, String
password2,
String name, String email) throws RegisterException //用戶注冊
void login(String username, String password) throws LoginException
//用戶登錄
其中register 方法接受兩個(gè)password 參數(shù),原因是:在用戶注冊時(shí),需要輸入兩遍
password,只有兩次輸入的password 一致,才允許注冊。
4) 創(chuàng)建UserBiz 接口的實(shí)現(xiàn)類。其中
為該實(shí)現(xiàn)類創(chuàng)建一個(gè)屬性,該屬性為一個(gè)Map,用來保存已注冊的用戶信息。Map
的鍵為用戶登錄名,值為登錄名對應(yīng)的User 對象。初始情況下,Map 中保存的對
象為以下兩個(gè):
用戶名 密碼 真實(shí)姓名 電子郵件
admin admin Administrator admin@123.com
tom cat tomcat tomcat@cat.com
register 方法在以下兩種情況下拋出異常:
1) username 在Map 中已存在
2) 兩次輸入的password 不一致
login 方法在以下兩種情況下拋出異常:
1) username 不存在
2) username 和password 不匹配
5) 創(chuàng)建一個(gè)UserView 接口,該接口中定義兩個(gè)方法:
void login();
void register();
6) 創(chuàng)建UserView 接口的實(shí)現(xiàn)類。
該實(shí)現(xiàn)類的login 方法中,利用命令行,讓用戶輸入用戶名和密碼,之后調(diào)用UserBiz
中的login 方法。部分代碼如下:
void login(){
System.out.println(“請輸入用戶名:”);
String username = ;
System.out.println(“請輸入密碼”);
String password = ;
//調(diào)用UserBiz 中的login 方法
}
該類的register 方法采用類似的方法,讓用戶輸入注冊時(shí)需要的信息,然后調(diào)用
UserBiz 中的register 方法。
注意:
1、 密碼應(yīng)該讓用戶輸入兩遍。
2、 UserViewImpl 中應(yīng)當(dāng)有一個(gè)UserBiz 類型的屬性
7) 編寫測試代碼。
類圖如下:
15. **(異常的捕獲和拋出)有以下代碼:
import java.io.*;
import java.sql.*;
public class TestMyException{
public static void main(String args[]){
try{
System.out.println("main1");
ma();
System.out.println("main2");
}catch(Exception e){
System.out.println("Catch Exception in main");
System.out.println(e.getMessage());
}
}
public static void ma() throws IOException{
try{
System.out.println("ma1");
mb();
System.out.println("ma2");
}catch(SQLException e){
System.out.println("Catch SQLException in ma");
throw new IOException(e.getMessage());
}catch(Exception e){
System.out.println("Catch Exception in ma");
System.out.println(e.getMessage());
}
}
public static void mb() throws SQLException{
throw new SQLException("sql exception in mb");
}
}
問:該程序輸出結(jié)果是什么?
16. **(異常的捕獲和拋出)有以下代碼
public class TestException{
public static void main(String args[]){
try{
System.out.println(“main1”);
ma();
System.out.println(“main2”);
}catch(Exception e){
System.out.println(“In Catch”);
}
}
public static void ma(){
System.out.println(“ma1”);
throw new NullPointerException();
System.out.println(“ma2”);
}
}
選擇正確答案:
A. 編譯出錯(cuò)
B. 編譯正常,輸出main1 ma1 In Catch
C. 編譯正常,運(yùn)行時(shí)出錯(cuò)
17. **(異常的捕獲和拋出)有如下代碼
import java.io.*;
import java.sql.*;
class TestException{
public static void main(String args[]){
try{
ma();
}
catch(Exception e){}
}
public static void ma() throws IOException{ }
}
下面哪些代碼放在處可以編譯通過?
A. catch(NullPointerException npe){}
B. catch(IOException ioe){}
C. catch(SQLException sqle){}
18. **(finally)有如下代碼
public class TestTryAndTry {
public static void main(String args[]){
System.out.println(ma());
}
public static int ma(){
try{
return 100;
}finally{
try{
return 200;
}finally{
return 500;
}
return 1000;
}
}
}
選擇正確答案:
A. 編譯錯(cuò)誤
B. 輸出100
C. 輸出200
D. 輸出500
E. 輸出1000
總結(jié)
以上是生活随笔為你收集整理的java 异常练习题_Java 异常(习题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML计算机英文字母,计算机入门知识
- 下一篇: php计算结果排序,php-按从数组计算