题目1(加强训练)
try{
String s = "hello";
String sub = s.substring(0);
System.out.println(sub);
s = null;
}catch(NullPointerException e){
System.out.println("空指针异常");
}
以上程序的运行结果是: ( )
A: 编译会出现错误.
B: 运行结果是控制台输出 “hello”.
C: 运行结果是控制台输出 “空指针异常”.
D: 运行结果是控制台输出然后输出空指针异常
答案:B
解析:代码中只是将String类型变量s赋值为null,并不会引发空指针异常。
题目2(加强训练)
观察以下代码
try{
int[] arr = new int[10];
System.out.println(arr[10]);
arr = null;
System.out.println(arr[0]);
}catch(ArrayIndexOutOfBoundsException e2){
System.out.println("数组角标越界");
}catch(NullPointerException e){
System.out.println("空指针异常");
}
以上代码运行,控制台会输出什么? ( )
A: 输出 “数组角标越界”.
B: 输出 “空指针异常”.
C: 输出 “数组角标越界” 和 “空指针异常”.
D: 代码编译报错
答案:A
解析:数组长度为10,所以索引范围:0–9,所以下面的代码:System.out.println(arr[10]);将引发数组索引越界异常。
题目3(加强训练)
观察以下代码
public static void main(String[] args){
int[] arr = null;
printArr(arr);
}
public static void printArr(int[] arr) throws NullPointerException{
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
运行以上程序,结果是:( )
A: 编译报错,因为printArr方法声明了异常,在方法调用时必须做异常处理。
B: 编译报错,因为不能将空值null作为参数传递给printArr方法。
C: 运行报错,调用printArr方法时没有异常处理,虚拟机捕获空指针异常后,会报出异常信息并结束运行。
D: 代码正常执行,没有错误,也没有输出数据,因为数组中没有元素。
答案:C
解析:在printArr方法中, i < arr.length将引发空指针异常,虽然声明抛出了空指针异常,但在main()方法调用此方法处并没有try…catch捕获,所以,最终虚拟机报出异常,并结束运行。
题目4(加强训练)
对于以下代码,说法正确的是: ( )
public static void main(String[] args) throw ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String s1 = "1989-12-11";
Date date = format.parse(s1);
}
A: 编译错误,第1行,throw 不能用到方法声明上,应该改成throws
B: 运行错误,因为格式化的格式与字符串的格式不匹配
C: 运行没有问题
D: 编译错误第行应该去掉
答案:A
题目5(加强训练)
以下关于自定义异常类错误的是: ( )
A: 开发中我们可以根据自己的业务逻辑需要,自定义不同的异常类
B: java提供的异常类不能完全满足开发的需求,所以要自定义异常类
C: 自定义异常类,通常要调用父类有一个参数的构造函数,因为是为了初始化异常信息
D: 自定义异常类跟提供的异常类没有任何关系
答案:D
题目6(加强训练)
观察以下代码
public class MyException extends Exception{
public MyException(){
}
public MyException(String message){
super(message);
}
}
以下描述正确的是:( )
A: 如果某个方法抛出了这个异常,那么在使用这个方法的时候必须try-catch处理
B: 如果某个方法抛出了这个异常,那么在使用这个方法的时候必须throws处理
C: 如果某个方法抛出了这个异常,那么在使用这个方法的时候可以不用处理
D: 如果某个方法抛出了这个异常我们可以用方式或者方式处理
答案:D
题目7(加强训练)
观察以下代码
public class WeightOutOfBoundsException extends Exception{
public WeightOutOfBoundsException(){
}
public WeightOutOfBoundsException(String message){
super(message);
}
}
public class Person{
private int weight;
public Person(int weight)throws WeightOutOfBoundsException{
if(weight < 0 || weight > 300){
throw new WeightOutOfBoundsException("体重不符合要求");
}
this.weight = weight;
}
}
观察以上代码,如果创建Person对象,下列哪种处理是正确的:( )
A: 直接 Person person = new Person();
B: 直接 Person person = new Person(70);
C: 只能将 Person person = new Person(70); 只能用 try-catch语句处理一下才可以
D: 可以在创建对象的方法上用关键字将这个异常声明出来
答案:D
知识点
并行和并发
题目1(加强训练)
以下关于并行和并发说法错误的是:( )
A: 并行表示同时在运行
B: 并发表示交替在运行
C: java程序是基于并发的
D: java程序是基于并行的
答案:D
题目2(加强训练)
以下哪种现象是在描述并发的: ( )
A: 火车上大家排队使用一个卫生间
B: 电影院里所有人同时看一个电影
C: 课堂上老师同时给每个学生讲课
D: 以上说法都正确
答案:A
知识点
多线程
题目1(加强训练)
观察以下代码
public static void main(String[] args){
Thread t = new Thread(){
public void run(){
System.out.println("我爱java");
}
};
___________________________;
}
请在横线处填入适当代码,使线程开启并运行:( )
A: t.run()
B: t.start()
C: t.run() 或者 t.start()都行
D: 以上说法都不正确
答案:B
题目2(加强训练)
下面关于如何开启线程说法错误的是: ( )
A: 可以使用线程对象调用run()方法开启线程;
B: 只能通过线程对象或者其子类对象,调用start()方法才能开启线程
C: 线程对象调用start()方法,jvm会帮我们开启一条线程,并且帮我们调用线程的run()方法;
D: 创建了线程对象并不代表该线程就开始运行了
答案:A
题目3(加强训练)
下列说法错误的是:()
A:Java程序,至少有两个线程;一个是垃圾回收线程,一个是执行main函数的线程;
B:所有程序中,都至少存在一个主线程;
C:多线程可以让程序同时执行多个任务,所以一个程序中线程越多越好;
D:多线程只是因为CPU执行速度非常快,可以再不同的任务之间迅速切换;并非同一时间点上执行多个任务;
答案:C
解析:多线程在任务切换时需要额外消耗资源;所以线程太多,会造成系统资源的额外浪费;
题目4(加强训练)
下列说法错误的是:
A:Java中创建一个线程可以通过继承Runnable接口的方式;
B:Java中创建一个线程可以通过继承Thread类的方式;
C:Java中启动一个线程是调用start方法;
D:Java中线程任务应该放在run方法中;
答案:A
解析:接口只能被实现,不能被继承;
题目5(加强训练)
下列说法错误的是:()
A:一个Thread类的子类的对象创建后,就启动了一个新的线程;
B:当一个线程对象调用start函数时,才启动一个新的线程;
C:线程启动后,不会立即执行,而是进入等待状态,等待获取CPU的执行权;
D:线程运行时,如果的执行权被其他线程抢走,这个线程就会进入等待状态,和其他线程一起抢的执行权;
答案:A
解析:线程类创建对象后,并没有创建新的线程;只有调用start函数才启动一个新的线程;
编程题
习题1
需求:
请对以下数组进行排序(分别用冒泡排序和选择排序)
int[] arr = {1,432,4,325,24,365,25,89,6,3,476,875,846};
import java.util.Arrays;
/**
* 请对以下数组进行排序(分别用冒泡排序和选择排序)
* int[] arr = {1,432,4,325,24,365,25,89,6,3,476,875,846};
*/
public class Demo{
public static void main(String[] args) {
int[] arr= {1,432,4,325,24,365,25,89,6,3,476,875,846};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
System.out.println("=================================================");
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 1 + i; j < arr.length; j++) {
if(arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
习题2
需求:
定义一个方法,功能是:可以获取一个int[]数组中的最大值。请实现此方法,并针对可能出现的异常情况使用throw抛出相应的异常,并给出提示信息。
public class Demo {
public static void main(String[] args) {
int[] arr = null;
getMax(arr);
}
public static void getMax(int[] arr){
if(arr == null){
throw new NullPointerException("空指针异常");
}
if(arr.length == 0){
throw new ArrayIndexOutOfBoundsException("数组中没有元素");
}
int max = arr[0];
for (int i : arr) {
if(max < i){
max = i;
}
}
System.out.println(max);
}
}
习题3
需求:
请使用代码实现
- 每一个学生(Student)都有学号,姓名和分数,分数永远不能为为负数。
- 如果试图给学生赋值一个负数,抛出一个自定异常
建立一个异常类:NoScoreException
1. public class NoScoreException extends Exception {
public NoScoreException() {
}
public NoScoreException(String message) {
super(message);
}
}
建立以个学生类Student
public class Student {
private String name;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) throws NoScoreException {
if(price >= 0){
this.price = price;
}else{
throw new NoScoreException("你的成绩" + price + "不能为负数");
}
}
}
建立测试类:
public class Demo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("张三");
try {
stu.setPrice(-10);
} catch (NoScoreException e) {
e.printStackTrace();
}
}
}
习题4
需求:
请使用代码描述
- 写一个方法实现用户登陆,传入用户名和密码
- 如果用户名错误,就抛出自定义登陆异常(LoginException),异常信息为用户名不存在。
- 如果密码错了就也抛出登陆异常,异常信息为密码错误
- 如果用户名和密码都对了,输出: 欢迎xxx
说明:正确用户名和密码都是admin
建立一个异常类:LoginException
public class LoginException extends Exception {
public LoginException() {
}
public LoginException(String message) {
super(message);
}
}
建立测试类:Demo
public class Demo {
public static void main(String[] args) throws LoginException {
Login("admin", "admin");
}
public static void Login(String uesr,String password) throws LoginException {
if(uesr.equals("admin")){
if(password.equals("admin")){
System.out.println("欢迎"+ uesr +"登录");
}else{
throw new LoginException("密码错误");
}
}else{
throw new LoginException("用户" + uesr + "不存在!");
}
}
}
习题5
需求:
开启一个线程执行任务:随机获得10个100到1000的整数并将10个整数相加求和,将求和结果输出。
public class Demo {
public static void main(String[] args) {
Random random = new Random();
new Thread(new Runnable() {
@Override
public void run() {
int sum = 0;
for (int i = 0; i < 10; i++) {
int num = random.nextInt(900) + 100;
sum += num;
}
System.out.println("十个100到1000的随机数和为" + sum);
}
}).start();
}
}
习题6
需求:
编写程序,创建两个线程对象,一根线程输出“播放背景音乐”,另一根线程输出“显示画面”,要求线程实现 Runnable接口,且使用匿名内部类实现。
public class Demo {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("播放背景音乐");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("显示画面");
}
}).start();
}
}
习题7
需求:
开启三个线程,分别执行以下三个运算,并将运算结果输出到控制台。
一个线程计算10!
一个线程计算5!
一个线程计算8!
注:n!=n*(n-1)(n-2)……*1
public class Demo {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
int sum = 1;
for (int i = 10; i > 1; i--) {
sum *= i;
}
System.out.println("10! = " + sum);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
int sum = 1;
for (int i = 5; i > 1; i--) {
sum *= i;
}
System.out.println("5! = " + sum);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
int sum = 1;
for (int i = 8; i > 1; i--) {
sum *= i;
}
System.out.println("8! = " + sum);
}
}).start();
}
}