Java 异常 -- 自定异常 -- 多线程(加强)

题目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

需求:
请使用代码实现

  1. 每一个学生(Student)都有学号,姓名和分数,分数永远不能为为负数。
  2. 如果试图给学生赋值一个负数,抛出一个自定异常
    建立一个异常类: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

需求:
请使用代码描述

  1. 写一个方法实现用户登陆,传入用户名和密码
  2. 如果用户名错误,就抛出自定义登陆异常(LoginException),异常信息为用户名不存在。
  3. 如果密码错了就也抛出登陆异常,异常信息为密码错误
  4. 如果用户名和密码都对了,输出: 欢迎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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值