目录
断点调试
基本介绍
断点调试的一些快捷键
断点调试例题
简易版零钱通系统
面向对象版
面向过程版
1.断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。进行分析从而找到这个Bug
2.断点调试是程序员必须掌握的技能。
3.断点调试也能帮助我们查看java底层源代码的执行过程,提高我们程序员的Java水平
F7:跳入方法内
F8:逐行执行代码
shiftf + F8 :跳出方法
思路分析:
1.我们知道对象的创建流程,会先加载类的信息
2.然后进行默认初始化,根据属性的类型进行默认初始化
3.然后进行显示初始化,看我们有没有之间给属性赋值,这一步是完成这样的操作的
4.才是我们的构造器初始化
package com.debug_;
//debug对象创建的过程,加深对调试的理解
public class DebugExercise {
public static void main(String[] args) {
//创建对象的流程
//(1) 加载 Person类信息
//(2) 初始化 2.1默认初始化, 2.2 显式初始化 2.3 构造器初始化
//(3) 返回对象的地址
Person jack = new Person("jack", 20);
System.out.println(jack);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
代码演示:
思路分析:
1.其实零钱通系统,并没有那么简单,我们这里写的只是,最基本的版本,而且只针对一个人来说,也没有多用户,所以非常的简单,只需要捋清楚逻辑即可
2.我们开打印菜单的控制上,使用了一个布尔类型的变量来控制,当用户需要退出时,只需要把loop置成false即可,并且我们在退出系统的过程中,还增加了判断,在代码中我们可以看到,先使用了一个无线循环,如果用户输入的不是y那么我们就一直不会退出
3.在编写收益入账的方法的时候,我们要注意,收入的金额不能小于0,否则不符合常理,因此如果用户的收入金额小于0,我们需要做出相应的处理
4.在编写消费的方法时候,我们要注意,消费的金额不能,大于余额,如果消费的金额比余额还要大,那么是非常不合理的,因此在这里,我们也要做出判断
5.我们最好把每个功能封装成一个方法,不要在使用以前的面向对象的编程思想,这样只需要去调用对应的方法即可,还方便管理
package idea.smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 零钱通系统
*/
public class smallChangeView {
private boolean loop = true;//改变量用于控制,菜单的打印
private Scanner scanner = new Scanner(System.in);
private String key = "";//该变量用于存放用户的输入
private double balance;//该变量表示余额
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM");
private String str = "===================零钱通明细=====================\n";
//编写方法显示明细
public void show() {
System.out.println(str);
}
//编写方法完成消费
public void consume() {
System.out.print("请输人消费的金额");
double money = scanner.nextDouble();
if (money > balance) {
System.out.println("消费的金额不可以超过余额");
return;
}
balance -= money;
str += money + "\t\t\t" + sdf.format(date) + "\t" + "余额" + balance + "\n";
}
//编写方法完成收益入账
public void RevenueEntry() {
System.out.print("请输入你的收入金额:");
double money = scanner.nextDouble();
if (money < 0) {
System.out.println("收入的金额不可以为小于0");
return;
}
balance += money;
str += money + "\t\t\t" + sdf.format(date) + "\t" + "余额" + balance + "\n";
}
//编写方法,完成退出
public void exit() {
//1.用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n。
for (; ; ) {
System.out.print("你确定要退出吗?y/n:");
char c = scanner.next().charAt(0);
if (c == 'y') {
System.out.println("退出零钱通系统");
loop = false;
return;
} else {
System.out.println("你的输入有误必须输入正确的y/n");
}
}
}
//编写方法,完成零钱通系统菜单的打印
public void viewMain() {
do {
System.out.println("\n=================零钱通菜单=====================");
System.out.println("\t\t\t1.零钱通明细");
System.out.println("\t\t\t2.收益入账");
System.out.println("\t\t\t3.消费");
System.out.println("\t\t\t4.退出");
System.out.print("请输入你的选择:");
key = scanner.next();
switch (key) {
case "1":
show();
//System.out.println("零钱通明细");
break;
case "2":
RevenueEntry();
//System.out.println("收益入账");
break;
case "3":
consume();
//System.out.println("消费");
break;
case "4":
//System.out.println("退出");
exit();
break;
default:
break;
}
} while (loop);
}
}
smallChangeSystem类
package idea.smallchange;
/**
* 该类完成对界面层的各种服务
*/
public class smallChangeSystem {
public static void main(String[] args) {
new smallChangeView().viewMain();
}
}
代码演示:
package com.SmallChange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
public static void main(String[] args) {
//属性
boolean loop = true;//用来判断是否继续打印菜单
Scanner scanner = new Scanner(System.in);//创建一个Scanner 对象用来接受用户的输入
String n = "";//定义一个字符串常量用来对switch进行判断
double money = 0;//表示金额
double balance = 0;//表示余额
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM");
String dtaial = "===================零钱通明细=====================";
do {
System.out.println("\n=================零钱通菜单=====================");
System.out.println("\t\t\t1.零钱通明细");
System.out.println("\t\t\t2.收益入账");
System.out.println("\t\t\t3.消费");
System.out.println("\t\t\t4.退出");
System.out.println("请选择1到4");
n = scanner.next();
switch (n) {
case "1"://打印零钱通明细
System.out.println(dtaial);
break;
//2. 在收益入账时,判断金额是否合理,并给出相应的提示。
case "2"://收益入账
System.out.println("请收益入账金额");
money = scanner.nextDouble();//定义一个money变量用来接受入账的金额
if (money < 0) {//因为是入帐收入 所以存进来的金额不能小于0 否则提示信息
System.out.println("请输入正确金额");
break;
}
balance += money;//此时余额就等于收益加上自己本身
date = new Date();//获取当前格式
dtaial += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t" + "余额" + balance;
break;
//2. 在收益入账和消费时,判断金额是否合理,并给出相应的提示。
case "3"://消费
System.out.println("请输入消费内容");
String consumption = scanner.next();//定义一个consumption变量用来接受消费的内容
System.out.println("请输入消费的金额");
double a = scanner.nextDouble();//定义一个a变量用来接受消费的金额
if (a > balance) {//消费的钱不可以超过余额
System.out.println("消费的价格超过余额范围应该在0 到" + balance + "之间");
break;
}
balance -= a;//消费之后余额就减去消费之后的钱
dtaial += "\n" + consumption + "\t" + a + "\t" + sdf.format(date) + "\t" + "余额" + balance;
break;
case "4"://退出
//1.用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n。
String judge = "";//定义一个judge变量用来保存输入的字符串
while (true) {//先给一个死循环如果用户不输入正常的字符那么就重复输入,直到输入正确的值为止
System.out.println("你确定要退出吗?请输入正确的选项y/n");//提示信息
judge = scanner.next();//接受用户输入
if ("n".equals(judge) || "y".equals(judge)) {
//用户输入的只能是y或者n 判断字符串是否相等要用equals方法
break;
}
}
//经过上面的判断那么就说明用户输入的值肯定是y或者n
if (judge.equals("y")) {//判断如果是y表示退出程序反之就是不退出
System.out.println("退出");
loop = false;//把do while的变量置成false那么就退出
}
break;
default:
System.out.println("你输入的内容有误");
break;
}
} while (loop);
}
}