一、前言

我有个习惯,学习任何一门编程语言都不喜欢上来就各种重型IDE、项目管理工具。所以,放到Java上,我还是喜欢直接用javac编译,然后直接运行。

二、安装

1.安装包

下载JDK并安装到本地。

2.操作

E:\2setsoft\1dev\jdk1.8.0_77添加到环境变量,改名为JAVA_HOME

3.验证

cmd输入javac -version查看版本号,表示成功。

三、项目创建

1.创建java单文件

比如Hello.java文件。

2.添加打印代码

1
2
3
4
5
6
7
8
public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello World! 2025-10-14 13:50");
}

}

3.编译代码

将上面的HelloWorld类编译成class

1
javac -encoding UTF-8 HelloWorld.java

运行成功后在当前文件夹下会生成 HelloWorld.class

4.运行代码

在当前文件夹下,找到生成的class,然后命令输入。

1
java HelloWorld

6.打包成jar

前面也是要先将程序编译成class,然后运行下面代码。

1
jar cvf Calculator.jar  Calculator.class

四、附加

1.java版计算器程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import java.util.Scanner; 
import java.util.ArrayDeque;
import java.util.Deque;

public class Calculator {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
System.out.println("🧮 Java 控制台计算器");
System.out.println("════════════════════");
System.out.println(" 支持操作: +, -, *, /");
System.out.println(" 输入格式: 数字 运算符 数字 (如: 2 + 3 * 4)");
System.out.println(" 输入 'exit' 退出程序");
System.out.println("════════════════════");

while (true) {
System.out.print("➤ 输入表达式: ");
String input = scanner.nextLine().trim();

if (input.equalsIgnoreCase("exit")) {
System.out.println("🛑 程序已退出");
break;
}

if (input.isEmpty()) {
System.out.println("⚠️ 错误:输入不能为空");
continue;
}

try {
double result = evaluateExpression(input);
System.out.printf("✅ 计算结果: %s = %.2f\n\n", input, result);
} catch (Exception e) {
System.out.println("❌ 错误: " + e.getMessage());
}
}
scanner.close();
}

/**
* 计算表达式值(支持运算符优先级)
* @param expression 数学表达式
* @return 计算结果
* @throws IllegalArgumentException 非法输入时抛出异常
*/
public static double evaluateExpression(String expression) {
// 移除所有空格
String expr = expression.replaceAll("\\s+", "");

// 检查非法字符
if (!expr.matches("[\\d.+\\-*/]+")) {
throw new IllegalArgumentException("包含非法字符");
}

Deque<Double> numbers = new ArrayDeque<>();
Deque<Character> operators = new ArrayDeque<>();

for (int i = 0; i < expr.length(); i++) {
char c = expr.charAt(i);

// 处理数字(包括小数)
if (Character.isDigit(c) || c == '.') {
StringBuilder numBuilder = new StringBuilder();
while (i < expr.length() &&
(Character.isDigit(expr.charAt(i)) || expr.charAt(i) == '.')) {
numBuilder.append(expr.charAt(i++));
}
i--; // 回退一步

try {
double number = Double.parseDouble(numBuilder.toString());
numbers.push(number);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("无效数字格式: " + numBuilder);
}

}

// 处理运算符
else if (isOperator(c)) {
while (!operators.isEmpty() &&
hasPrecedence(c, operators.peek())) {
calculateTop(numbers, operators);
}
operators.push(c);
} else {
throw new IllegalArgumentException("无效字符: " + c);
}
}


// 计算剩余操作
while (!operators.isEmpty()) {
calculateTop(numbers, operators);
}

if (numbers.size() != 1 || !operators.isEmpty()) {
throw new IllegalArgumentException("无效表达式格式");
}

return numbers.pop();
}

/**
* 执行栈顶运算
*/
private static void calculateTop(Deque<Double> numbers, Deque<Character> operators) {
if (numbers.size() < 2 || operators.isEmpty()) {
throw new IllegalArgumentException("运算符缺失");
}

double b = numbers.pop();
double a = numbers.pop();
char op = operators.pop();

switch (op) {
case '+': numbers.push(a + b); break;
case '-': numbers.push(a - b); break;
case '*': numbers.push(a * b); break;
case '/':
if (b == 0) throw new ArithmeticException("除零错误");
numbers.push(a / b);
break;
default: throw new IllegalArgumentException("不支持的操作符: " + op);
}
}

/**
* 检查运算符优先级
* @param current 当前运算符
* @param previous 栈顶运算符
* @return 当前运算符是否优先级较低或相等
*/
private static boolean hasPrecedence(char current, char previous) {
if (previous == '(' || previous == ')') return false;
return (current != '*' && current != '/') ||
(previous != '+' && previous != '-');
}

private static boolean isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
}

五、写在后面

基本的单demo文件练习结束后,熟悉了程序编译和运行,但是对java的基础语法还是需要认真研究一下,虽然和C#类似,待更新~

image-20250408192801332