标题有关异常机制的总结,同时通过编写快递管理控制台项目加深对异常以及数组等知识点的理解。
首先复习一下异常机制。
java中的异常分为两大类:
受检异常(异常会显示红色)和非受检异常(异常不会显示红色)
常用的异常是try…catch…finally以及throws
1、关于try…catch…fnally的知识汇总(面试常问)
语法为:
try{
有可能发生异常的代码段
}catch(异常类型 对象名){
异常的处理操作
}finally{
必然执行的异常的统一的出口
}
无论是否发生异常,finally必然执行
2、关于throws抛异常
如果是因为传递参数而导致的异常,应该通过throws将异常抛出去。
接下来是有关快递管理控制台项目的实例,主要采用的是MVC设计模式,该模式可以将传统 的输入、处理和输出功能映射在一个逻辑的图形化用户界面的结构中。具体的需求如下:
代码的编写主要分为了四个部分,Epress.java,ExpressControl.java,Views.java,Main.java首先是Express.java,这段代码里面主要讲解的是创建需要用到的属性,并生成get和set方法,同时重写tostring()和equals()方法。对应的代码如下:
package com.user.bean;
import java.util.Objects;
public class Express {
//快递公司
private String company;
@Override
public String toString() {
return "Express{" +
"company='" + company + '\'' +
", number='" + number + '\'' +
", extractioncode='" + extractioncode + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return Objects.equals(number, express.number);
}
@Override
public int hashCode() {
return Objects.hash(number);
}
//快递单号
private String number;
//快递取件码
private int extractioncode;
public Express() {
}
public Express(String company, String number, int extractioncode) {
this.company = company;
this.number = number;
this.extractioncode = extractioncode;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public int getExtractioncode() {
return extractioncode;
}
public void setExtractioncode(int extractioncode) {
this.extractioncode = extractioncode;
}
}
接下来是ExpressControl.java,这段代码中主要实现的是对于数据的处理以及创建二维数组存储数据,对应的代码如下:
package com.user.control;
import com.user.bean.Express;
import java.util.Random;
public class ExpressControl {
private Express[][] data = new Express[10][];
private int size;
{
for(int i=0;i<10;i++){
data[i] = new Express[10];
}
}
private Random random = new Random();
public boolean add(Express e){
if(size == 100){
return false;
}
//随机生成2个0-9的下标
int x = -1;
int y = -1;
while(true){
x = random.nextInt(10);
y = random.nextInt(10);
if(data[x][y] == null){
break;
}
}
int code = randomCode();
e.setExtractioncode(code);
data[x][y] = e;
return true;
}
private int randomCode(){
while(true) {
int code = random.nextInt(900000) + 100000;
Express e = findByCode(code);
if (e == null) {
return code;
}
}
}
public Express findByNumber(String number){
Express e = new Express();
e.setNumber(number);
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(e.equals(data[i][j])){
return data[i][j];
}
}
}
return null;
}
public Express findByCode(int code){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(data[i][j] != null)
if(data[i][j].getExtractioncode() == code){
return data[i][j];
}
}
}
return null;
}
public void update(Express oldExpress,Express newExpress){
delete(oldExpress);
add(newExpress);
}
public void delete(Express e) {
p:for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (e.equals(data[i][j])) {
data[i][j] = null;
break p;
}
}
}
}
public Express[][] findAll(){
return data;
}
}
其次是视图界面,主要用于创建视图,实现和用户的交互,对应的代码如下:
package com.user.view;
import com.user.bean.Express;
import java.util.Random;
import java.util.Scanner;
public class Views {
private Scanner input = new Scanner(System.in);
private Random random = new Random();
/*
欢迎界面
*/
public void welcome(){
System.out.println("欢迎使用小区快递管理系统");
}
/**
* 再见界面
*/
public void bye(){
System.out.println("程序即将关闭,欢迎再次使用");
}
/**
* 主菜单界面
*/
public int mainmenu(){
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递员");
System.out.println("2.普通用户");
System.out.println("0.退出");
String text = input.nextLine();
int num = -1;
try{
num = Integer.parseInt(text);
}catch(NumberFormatException e){
}
if(num<0||num>2){
return mainmenu();
}
return num;
}
/**
* 快递管理员界面
* @return
*/
int num = -1;
try{
num = Integer.parseInt(text);
}catch(NumberFormatException e){
}
if(num<0||num>4){
return cMenu();
}
return num;
}
public Express insert(){
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入快递单号:");
String number= input.nextLine();
System.out.println("请输入快递公司:");
String company = input.nextLine();
Express e = new Express();
e.setCompany(company);
e.setNumber(number);
return e;
}
/**
* 提示用户输入快递单号
* @return
*/
public String findByNumber(){
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入要操作的快递单号:");
String number = input.nextLine();
return number;
}
/**
* 输出快递信息
* @param e
*/
public void printExpress(Express e){
System.out.println("快递信息如下:");
System.out.println("快递公司:"+e.getCompany()+",快速单号:"+e.getNumber()+",取件码:"+e.getExtractioncode());
}
/**
* 修改快递信息
* @return
*/
public void update(Express e){
System.out.println("请输入新的快递单号:");
String number = input.nextLine();
System.out.println("请输入新的快递公司");
String company = input.nextLine();
e.setNumber(number);
e.setCompany(company);
}
/**
* 询问是否确认删除
* @return
*/
public int delete(){
System.out.println("是否确认删除?");
System.out.println("1.确认删除");
System.out.println("2.取消删除");
String text= input.nextLine();
int num = -1;
try{
num = Integer.parseInt(text);
}catch(NumberFormatException e){
}
if(num<1||num>2){
System.out.println("输入有误,请重新输入");
return delete();
}
return num;
}
/**
* 遍历显示给定数组的快递信息
*/
public void printAll(Express[][] es){
int count = 0;
for(int i=0;i<es.length;i++){
for(int j =0;j<10;j++){
if(es[i][j] != null){
count++;
System.out.print("第"+(i+1)+"排"+(j+1)+"列快递:");
printExpress(es[i][j]);
}
}
}
if(count == 0){
System.out.println("暂无快递信息");
}
}
public int uMenu(){
System.out.println("请根据提示,进行取件");
System.out.println("请输入您的取件码");
String code = input.nextLine();
int num = -1;
try{
num = Integer.parseInt(code);
}catch(NumberFormatException e){
}
if(num<100000||num>999999){
System.out.println("输入有误,请重新输入");
return uMenu();
}
return num;
}
public void expressExist(){
System.out.println("此单号在快递柜中已存在,请勿重复存储。");
}
public void printNull(){
System.out.println("此快递不存在,请检查您的输入");
}
public void success(){
System.out.println("删除成功!");
}
}
最后是主程序,Main.java,对应的代码如下:
package com.user.main;
import com.user.control.ExpressControl;
import com.user.view.Views;
import com.user.bean.Express;
public class Main {
//static关键字就是提供给自身类里面的其他static方法调用
private static Views v = new Views();
private static ExpressControl control = new ExpressControl();
public static void main(String[] args) {
v.welcome();
m:while(true){
int menu = v.mainmenu();
switch(menu){
case 0:
break m;
case 1:
cClient();
break;
case 2:
uClient();
break;
}
}
v.bye();
}
private static void uClient(){
int code = v.uMenu();
Express e = control.findByCode(code);
if(e == null) {
v.printNull();
}else{
v.success();
v.printExpress(e);
control.delete(e);
}
}
private static void cClient(){
while(true) {
int menu = v.cMenu();
switch (menu) {
case 0:
return;
case 1:{
Express e = v.insert();
Express e2 = control.findByNumber(e.getNumber());
if(e2 == null){
control.add(e);
v.printExpress(e);
}else{
v.expressExist();
}
}
break;
case 2:{
String number = v.findByNumber();
Express e = control.findByNumber(number);
if(e == null){
v.printNull();
}
Express e2 = e;
v.printExpress(e);
v.update(e2);
control.update(e,e2);
v.printExpress(e2);
}
break;
case 3:{
String number = v.findByNumber();
Express e = control.findByNumber(number);
if(e == null){
v.printNull();
}else{
v.printExpress(e);
int type = v.delete();
if(type == 1){
control.delete(e);
v.success();
}
}
}
break;
case 4:{
Express[][] data = control.findAll();
v.printAll(data);
}
break;
}
}
}
}