Java試題-選擇題(22)
題目
-
以下對JDBC事務描述錯誤的是 ?
A) JDBC事務屬于JAVA事務的一種
B) JDBC事務屬于容器事務類型
C) JDBC事務可以保證操作的完整性和一致性
D) JDBC事務是由Connection發起的,并由Connection控制 -
要通過可滾動的結果集更新數據,以下正確的是 ?
A) pst=con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE)
B) pst=con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY)
C) pst=con.prepareStatement(sql, Resu ltSet.TYPE_SCROLL_SENSITIVE)
D) pst=con.prepareStatement(sql, ResultSet.CONCUR_UPDATABLE) -
存儲過程pro有兩個參數,第一個為輸入參數,第二個為輸出參數,以下代碼正確的是?
A) CallableStatement cst=con.prepareCall(“(call pro(?,?))”);
B) CallableStatement cst=con.prepareCall(“(call pro(?))”);
C) CallableStatement cst=con.prepareCall(“{call pro(?,?)}”);
D) CallableStatement cst=con.prepareCall(“{call pro(?,?,?)}”); -
以下描述正確的是 ?
A) CallableStatement是PreparedStatement的父接口
B) PreparedStatement是CallableStatement的父接口
C) CallableStatement是Statement的子接口
D) PreparedStatement是Statement的父接口 -
要刪除book表中書籍(bookName)是”java”的記錄,以下代碼正確的是 ?
A) pst.setString(1,”java”);
B) pst.setString(0,”java”);
C) pst.setInt(0,”java”);
D) 以上選項都不正確
String sql=”delete from book where bookName=?”;
PreparedStatement pst=con.preparedStatement(sql);
______________________________
pst.execute();
-
獲取ResutlSet對象rst的第一行數據,以下正確的是 ?
A) rst.hashNext();
B) rst.next();
C) rst.first();
D) rst.nextRow(); -
以下可以正確獲取結果集的有 ?
A) Statement sta=con.createStatement();
ResultSet rst=sta.executeQuery(“select * from book”);
B) Statement sta=con.createStatement(“select * from book”);
ResultSet rst=sta.executeQuery();
C) PreparedStatement pst=con.preparedStatement();
ResultSet rst=pst.executeQuery(“select * from book”);
D) PreparedStatement pst=con.preparedStatement(“select * from book”);
ResultSet rst=pst.executeQuery(); -
執行下列語句,變量a的值為:()
A. 0x26bdc00
B. 0xc6bdc00
C. 0x3fa0000
D. 0x7e02ffff
int a = 0x9af700; //1001 1010 1111 0111 0000 0000
a <<= 2;
- 下列代碼的輸出結果是() ?
A.0
B.99
C.100
D.101
int j=0;
for(int i=0;i<100;i++){j=j++;
}
System.out.println(j);
- 下列代碼,如果想保證程序的輸出結果是[1,2],那么<插入代碼>處應填入的代碼是()
A.Set set = new TreeSet();
B.Set set = new HashSet();
C.Set set = new SortedSet();
D.Set set = new LinkedHashSet()
public static void main(String[] args) {< 插入代碼>set.add(new Integer(2));set.add(new Integer(1));System.out.println(set);
}
- 下列代碼的運行結果是() ?
A.編譯失敗
B.運行時,拋出異常
C.Forest的實例被序列化到文件
D.Forest的實例和Tree的實例都被序列化到文件
public class Forest implements Serializable {private Tree tree = new Tree();public static void main(String[] args) {Forest f = new Forest();try {FileOutputStream fs = new FileOutputStream(“Forest.ser”);ObjectOutputStream os = new ObjectOutputStream(fs);os.writeObject(f);os.close();} catch (Exception ex) {ex.printStackTrace();}}
}
class Tree {}
- 請看下列代碼,假設運行后輸出“The value of p is 420”,那么<插入代碼>處應填入代碼是:
A. p.setWeight(420);
B. Payload.setWeight(420);
C. p = new Payload(420);
D. p = new Payload(); p.setWeight(420);
class Payload {private int weight;public Payload(int wt) {weight = wt;}public Payload() {}public void setWeight(int w) {weight = w;}public String toString() {return Integer.toString(weight);}
}
public class TestPayload {static void changePayload(Payload p) {< 插入代碼>}public static void main(String[] args) {Payload p = new Payload();p.setWeight(1024);changePayload(p);System.out.println(“The value of p is ” + p);}
}
-
下面關于ResultSet說法錯誤的是()
A.ResultSet的的方法getString(…)意為取得該列的數據以字符串的形式返回
B.查詢結束后,ResutSet中的游標指向第一條記錄之上,因此要先調用一次next才有可能取得記錄
C.查詢結束后,所有的結果數據將一次被存儲在ResultSet對象中
D.關閉連接時最好按照resultSet先關,statement接著,connection最后的順序 -
Java語句 String s=”a”+”b”+”c”+”d”+”e”; 創建對象的總個數是:() ?
A.1
B.2
C.3
D.4 -
下列代碼的輸出結果是 ?
A. 0
B. 0.1
C. 0.10000000000000009
D. 0.10
public static void main(String[] args) {BigDecimal d1 = new BigDecimal(“3.0″);BigDecimal d2 = new BigDecimal(“2.9″);BigDecimal d3 = d1.subtract(d2);System.out.println(d3);
}
- 運行下面程序,輸出的結果是:
A.
condition 1
finally
B.
condition 2
finally
C.
condition 1
condition 3
finally
D.
condition 1
condition 2
finally
public class Foo{public static void main(String[] args) {try {test();System.out.println(“condition 1″);} catch (ArrayIndexOutOfBoundsException e) {System.out.println(“condition 2″);} catch (Exception e) {System.out.println(“condition 3″);} finally {System.out.println(“finally”);}}public static void test() {String str = “cc”;str.compareTo(“abc”);}
}
- 關于下列代碼說法正確的是 ?
A. 該類編譯失敗
B. 輸出:1
C. 輸出:3
D. 輸出:0
public class A {private int counter = 0;public static int getInstanceCount() {return counter;}public A() {counter++;}public static void main(String[] args) {A a1 = new A();A a2 = new A();A a3 = new A();System.out.println(A.getInstanceCount());}
}
- 運行下列代碼發生的異常或錯誤是 ?
A. java.lang. StackOverflowError
B. java.lang.IllegalStateException
C. java.lang.ExceptionlnlnitializerError
D. java.lang.ArraylndexOutOfBoundsException
public class ClassB {public void count(int i) {count(++i);}public static void main(String[] args) {ClassB a = new ClassB();a.count(3);}
}
-
為了獲取遠程主機的文件內容,當創建URL對象后,需要使用哪個方法獲取信息()
A. getHost()
B.openStream(
C. getPort()
D.openConnection() -
下列Java類的定義,錯誤的是() ?
A.public class Test extends Object{……}
B.final class Operators{……}
C.class Point{……}
D.void class Point{……}
答案
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|
B | A | C | B | A | B | A | A | A | A |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|
B | A | C | A | B | A | A | A | B | D |
解析
1. B
B) JDBC事務屬于容器事務類型?:錯誤。JDBC事務是?本地事務(resource-local transaction)?,由數據庫連接(Connection)直接管理,僅限于單個數據庫。而“容器事務”通常指由Java EE應用服務器(如WebLogic、JBoss)管理的?分布式事務?,使用JTA(Java Transaction API)實現,支持跨多個資源(如多個數據庫)。JDBC事務不屬于容器事務類型,因此該描述錯誤。
2. A
A) pst=con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)?
同時滿足可滾動(TYPE_SCROLL_SENSITIVE)和可更新(CONCUR_UPDATABLE),正確。
B) pst=con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY)?
結果集可滾動,但并發模式為只讀(CONCUR_READ_ONLY),無法更新數據。
C) pst=con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE)?
語法錯誤:prepareStatement 方法的重載要求同時指定結果集類型和并發模式(兩個參數)。僅提供一個參數會導致編譯失敗。
D) pst=con.prepareStatement(sql, ResultSet.CONCUR_UPDATABLE)?
語法錯誤:同樣缺少參數,CONCUR_UPDATABLE 必須與結果集類型(如 TYPE_SCROLL_SENSITIVE)一起指定。
3.C
選項A?: CallableStatement cst=con.prepareCall(“(call pro(?,?))”);
錯誤:使用了圓括號()而不是花括號{}。JDBC要求存儲過程調用必須用{}包裹。
選項B?: CallableStatement cst=con.prepareCall(“(call pro(?))”);
錯誤:使用了圓括號()而非花括號{},并且參數數量不正確(只有1個)。存儲過程需要兩個參數(一個輸入,一個輸出),但這里只提供了一個?。
選項C?: CallableStatement cst=con.prepareCall(“{call pro(?,?)}”);
正確:使用了花括號{},參數數量為兩個?,符合存儲過程的定義。第一個?對應輸入參數,第二個?對應輸出參數(后續需要通過cst.registerOutParameter(2, Types.XXX)注冊為輸出類型)。
選項D?: CallableStatement cst=con.prepareCall(“{call pro(?,?,?)}”);
錯誤:使用了花括號{},但參數數量為三個?,而存儲過程只有兩個參數。這會拋出SQLException,因為參數數量不匹配。
4. B
Statement 是頂層接口,用于執行靜態SQL語句。
PreparedStatement 繼承自 Statement,是它的子接口,用于預編譯SQL語句,提高執行效率。
CallableStatement 繼承自 PreparedStatement,是它的子接口,專門用于調用存儲過程。
因此,繼承鏈為:
Statement ← PreparedStatement ← CallableStatement
分析選項:
A) CallableStatement是PreparedStatement的父接口?:錯誤。CallableStatement 是 PreparedStatement 的子接口,而不是父接口。
B) PreparedStatement是CallableStatement的父接口?:正確。PreparedStatement 是 CallableStatement 的直接父接口。
C) CallableStatement是Statement的子接口?:錯誤。雖然 CallableStatement 間接繼承自 Statement(通過 PreparedStatement),但“子接口”通常指直接繼承關系。CallableStatement 的直接父接口是 PreparedStatement,而不是 Statement。Statement 的直接子接口是 PreparedStatement。
D) PreparedStatement是Statement的父接口?:錯誤。PreparedStatement 是 Statement 的子接口,而不是父接口。
5. A
PreparedStatement 的參數占位符(?)索引是從 ?1? 開始計數的,而非0。因此 setString(1, “java”) 是正確的。
6.B
A) rst.hashNext();?:
錯誤。ResultSet 沒有 hashNext() 方法(可能是拼寫混淆)。正確的方法是 hasNext(),但 JDBC 的 ResultSet 實際使用的是 ?next()?。
B) rst.next();?:
正確?。next() 方法將游標?從初始位置移動到第一行?。如果第一行存在則返回 true,否則返回 false。這是獲取第一行數據的標準操作。
C) rst.first();?:
錯誤。first() 方法僅適用于?可滾動的 ResultSet?(如 TYPE_SCROLL_INSENSITIVE),但默認的 ResultSet 是?不可滾動?的(只能單向移動)。若在默認 ResultSet 上調用 first() 會拋出 SQLFeatureNotSupportedException。
D) rst.nextRow();?:
錯誤。ResultSet 沒有 nextRow() 方法(該方法不存在于 JDBC API 中)。
7.A
Statement 的正確用法?:
創建:con.createStatement()
執行查詢:sta.executeQuery(String sql)
PreparedStatement 的正確用法?:
創建:con.prepareStatement(String sql)(?注意拼寫?)
執行查詢:pst.executeQuery()(?無參數?)
常見錯誤?:
方法名拼寫錯誤(如 preparedStatement)。
參數缺失或多余(如 createStatement(sql) 或 executeQuery(sql) 用于 PreparedStatement)。
8. A
初始值?:
int a = 0x9af700;
十六進制 0x9af700 的二進制表示為:
1001 1010 1111 0111 0000 0000(24位)。
在 int 類型(32位)中,完整二進制為:
00000000 10011010 11110111 00000000。
左移操作?:
a <<= 2; 表示將 a 的二進制值左移 2 位:
高位溢出部分丟棄,低位補 0。
移位后二進制結果為:
00000010 01101011 11011100 00000000。
轉換為十六進制?:
將 32 位二進制按 4 位一組分組:
0000 0010 0110 1011 1101 1100 0000 0000
對應的十六進制:
0 2 6 B D C 0 0
合并結果為:?0x026bdc00?(通常簡寫為 0x26bdc00)。
9. A
代碼中,j = j++; 是核心語句。
j++ 是后綴遞增操作符,其行為是:返回 j 的當前值,然后將 j 增加 1。
因此,j = j++; 的執行步驟為:
1、計算 j++:返回 j 的當前值(例如初始值 0),然后 j 被隱式增加為 1。
2、將步驟 1 返回的值(0)賦值給 j,覆蓋了之前的增加,因此 j 最終變回 0。
在循環中,每次迭代執行 j = j++;:
無論迭代多少次(這里循環 100 次),j 的值始終被重置為 0。
最終,System.out.println(j); 輸出 0。
如果改為 j++;(不帶賦值),則每次迭代 j 會增加 1,輸出 100。
如果改為 j = ++j;(前綴遞增),則輸出 100。
但此處是 j = j++;,因此輸出為 0。
10. A
A) Set set = new TreeSet();?
TreeSet 基于紅黑樹實現,元素?按自然順序(升序)自動排序?。
添加 Integer(2) 和 Integer(1) 后,會排序為 [1, 2]。
B) Set set = new HashSet();?
HashSet 基于哈希表實現,?不保證順序?(可能輸出 [1,2] 或 [2,1])。
順序不確定。
C) Set set = new SortedSet();?
SortedSet 是一個?接口?,無法直接實例化(編譯錯誤)。
語法錯誤。
D) Set set = new LinkedHashSet();?
LinkedHashSet 維護?插入順序?。
先添加 2,后添加 1,輸出為 [2, 1]。
11. B
序列化要求?:
如果一個類實現了 Serializable 接口,其所有成員變量必須是可序列化的(基本類型或實現 Serializable 的引用類型)。
此處 Forest 實現了 Serializable,但其成員 private Tree tree = new Tree(); 中的 Tree 類?未實現 Serializable 接口?。
序列化過程?:
當執行 os.writeObject(f) 時,會嘗試序列化 Forest 對象及其所有成員(包括 tree 對象)。
由于 Tree 類不可序列化,Java 會拋出 java.io.NotSerializableException(運行時異常)。
12. A
A. p.setWeight(420);?
直接調用 p 的 setWeight 方法,修改 weight 為 420。符合邏輯。
B. Payload.setWeight(420);?
錯誤:setWeight 是實例方法,不能通過類名調用。
C. p = new Payload(420);?
錯誤:重新賦值 p 不會影響原對象(Java 是值傳遞)。
D. p = new Payload(); p.setWeight(420);?
錯誤:同 C,重新創建對象不會影響原對象。
13. C
錯誤原因分析:
ResultSet 的數據加載機制?:
ResultSet ?默認不會一次性加載所有查詢結果?(特別是大型數據集)。它的行為取決于驅動和配置:
對于 TYPE_FORWARD_ONLY 類型的 ResultSet,數據通常是?逐步從數據庫流式傳輸?的(按需加載)。
即使使用可滾動的 ResultSet,驅動程序也可能分批加載數據(非一次性全加載)。
數據庫連接關閉前,ResultSet 可能只持有部分結果集。
14. A
編譯器優化?:
由于所有連接的元素都是字符串字面量(常量),編譯器會在編譯階段直接將其合并為一個完整的字符串常量 “abcde”。
編譯后的代碼等價于:String s = “abcde”;。
15. B
BigDecimal 的精確計算?:
BigDecimal 用于高精度的十進制運算,避免浮點計算的精度誤差。
使用字符串構造(如 new BigDecimal(“3.0”))可以精確表示數值。
數學上:3.0 - 2.9 = 0.1。
BigDecimal 會精確輸出 0.1?,沒有浮點誤差。
16. A
A?:輸出 condition 1 和 finally(符合邏輯)。
B?:包含 condition 2(不匹配,未觸發 ArrayIndexOutOfBoundsException)。
C?:包含 condition 3(不匹配,未觸發任何 Exception)。
D?:包含 condition 2(不匹配,未觸發異常)。
17. A
編譯錯誤?:
getInstanceCount() 是靜態方法(static),但試圖直接訪問實例變量(非靜態)counter。
Java 規則?:靜態方法只能訪問靜態成員(類變量/方法),不能直接訪問實例成員。
編譯器會報錯:non-static variable counter cannot be referenced from a static context。
18. A
代碼邏輯分析?:
類 ClassB 包含一個遞歸方法 count(int i),每次調用時對參數 i 進行自增(++i)并再次調用自身。
main 方法中創建 ClassB 實例并調用 count(3),觸發無限遞歸。
遞歸調用無終止條件,導致棧空間被持續占用,最終拋出 ?棧溢出錯誤?(StackOverflowError)。
19. B
openStream()?:
URL類的openStream()方法直接?打開與遠程資源的連接,并返回一個InputStream?,用于讀取文件內容(如文本、二進制數據)。這是獲取文件內容的最簡方式。
其他選項分析?:
A. getHost()?:僅返回URL的主機名(如example.com),不涉及文件內容。
C. getPort()?:返回URL的端口號(未顯式指定時返回-1),與文件內容無關。
D. openConnection()?:返回URLConnection對象,需通過getInputStream()進一步獲取輸入流,步驟多于openStream(),非最直接方式。
20. D
語法錯誤?:Java類的聲明?不能包含返回類型?(如void、int等)。
正確語法應為:[訪問修飾符] class 類名 { … }
void是方法的返回類型標識符,只能用于方法聲明(如void method())。